検索
ホームページJava&#&チュートリアルJava スレッドを作成して開始する

Java スレッドは、他のオブジェクトと同様のオブジェクト タイプです。スレッドは、java.lang.Thread クラスのインスタンス、またはこのクラスのサブクラスのインスタンスです。 Java スレッドはオブジェクト タイプであるだけでなく、コードを実行することもできます。

スレッドの作成と開始

スレッドの作成は次のように行うことができます:

Thread thread = new Thread();

Java スレッドを開始するには、次のように start メソッドを呼び出す必要があります:

thread.start();

この例ではどのスレッドがコードを実行するかは指定しません。このスレッドは開始後すぐに停止されます。

このスレッドが実行するコードを指定するには 2 つの方法があります。最初の方法は、スレッドのサブクラスを作成し、 run() メソッドをオーバーライドすることです。 2 番目の方法は、Runnable インターフェイスを実装するオブジェクトを Thread コンストラクターに渡すことです。両方の方法については以下で説明します。

スレッド サブクラス

スレッドが実行するコードを指定する最初の方法は、スレッド サブクラスを作成し、run() メソッドをオーバーライドすることです。この run() メソッドは、start() メソッドを呼び出した後、このスレッドによって実行されます。以下に例を示します:

public class MyThread extends Thread {

    public void run(){
       System.out.println("MyThread running");
    }
  }

上記のスレッドを作成して開始するには、次のように実行できます:

 MyThread myThread = new MyThread();
  myTread.start();


スレッドが開始されるとすぐに、start() メソッドが戻ります。 run() メソッドが終了するまで待機しません。この run() メソッドは異なる CPU によって実行されます。この run() メソッドが実行されると、「MyThread running」というテキスト コンテンツが出力されます。

次のようなスレッドの匿名サブクラスを作成することもできます:

Thread thread = new Thread(){
    public void run(){
      System.out.println("Thread Running");
    }
  }

  thread.start();


この例の結果は上記と同じになります。

Runnable インターフェースの実装

スレッドが実行するコードを指定する 2 番目の方法は、java.lang.Runnable インターフェースを実装するクラスを作成することです。この Runnable オブジェクトはスレッドによって実行できます。

ここに例を示します:

public class MyRunnable implements Runnable {

    public void run(){
       System.out.println("MyRunnable running");
    }
  }

run メソッドをスレッドで実行するには、MyRunnable インスタンスをスレッドのコンストラクターに渡す必要があります。以下に例を示します:

Thread thread = new Thread(new MyRunnable());
   thread.start();

このスレッドが開始されると、独自の run メソッドを実行する代わりに、MyRunnable の run メソッドを呼び出します。上の例では、「MyRunnable running」というテキストが出力されます。

次のような匿名実装を作成することもできます:


Runnable myRunnable = new Runnable(){

     public void run(){
        System.out.println("Runnable running");
     }
   }

   Thread thread = new Thread(myRunnable);
   thread.start();


スレッドを継承しますか、それともインターフェイスを実装しますか?

2 つの方法のうちどちらが最適であるかについてのルールはありません。どちらの方法でも機能します。ただし、私個人としては、Runnable インターフェイスを実装し、この実装のインスタンスを Thread インスタンスとして管理することを好みます。スレッド プールによって実行される Runnable 実装がある場合、プールのスレッドが空くまで Runnable インスタンスをキューに入れるのは簡単です。 Thread サブクラスを使用してこれを実現するのは少し困難です。

通常、Runnable を実装するだけでなく、サブクラス Thread も実装する必要があります。たとえば、Thread サブクラスを作成すると、複数の Runnable を実行できます。これは、スレッド プールを実装する典型的な例です。

よくある落とし穴: start() の代わりに run() を呼び出す

スレッドを作成して開始するとき、よくある間違いは、次のように、start メソッドの代わりに Thread の run メソッドを呼び出すことです。 Runnable の run メソッドも期待どおりに実行されるため、おそらく何も気付かなかったでしょう。ただし、作成した新しいスレッドによっては実行されません。作成したスレッドを置き換えたスレッドの run メソッドが実行されます。言い換えれば、上記の 2 行のコードが実行されるスレッドです。新しく作成されたスレッド インスタンスの run メソッドを呼び出すには、start メソッドを呼び出す必要があります。

スレッド名 Java スレッドを作成するときに、名前を付けることができます。この名前は、異なるスレッドを区別するのに役立ちます。たとえば、複数のスレッドがこの出力を書き込んだ場合、どのスレッドがどのテキストを書き込んだのかがわかります。以下に例を示します:

Thread newThread = new Thread(MyRunnable());
  newThread.run();  //should be start();

Thread コンストラクターに渡される文字チャネル引数に注目してください。この文字列はスレッドの名前です。この名前は、Thread の getName メソッドを通じて取得できます。 Runnable 実装を実行するときに、名前を渡すこともできます。次のように:

Thread thread = new Thread("New Thread") {
      public void run(){
        System.out.println("run by: " + getName());
      }
   };


   thread.start();
   System.out.println(thread.getName());

ただし、MyRunnable クラスは Thread クラスのサブクラスではないため、それを実行しているスレッドの getName() メソッドにアクセスできないことに注意してください。


Thread.currentThread()このメソッドは、実行されている現在のスレッドの Thread インスタンスへの参照を返します。このようにして、コードのブロックを実行しているスレッドの Thread オブジェクトにアクセスできます。以下に例を示します。

MyRunnable runnable = new MyRunnable();
   Thread thread = new Thread(runnable, "New Thread");

   thread.start();
   System.out.println(thread.getName());

Thread オブジェクトへの参照を取得したら、そのオブジェクトのメソッドを呼び出すことができます。たとえば、実行中のスレッドの名前を取得できます:

Thread thread = Thread.currentThread();


Java Thread Instance

这里有一个小的例子。首先它打印出来了正在执行的main方法的线程的名字。这个线程是被JVM分配的。然后启动了10个线程,以及给予他们所有作为名称(“”+i)的一个数字。每一个线程然后打印出名字,以及停止执行。

public class ThreadExample {

  public static void main(String[] args){
    System.out.println(Thread.currentThread().getName());
    for(int i=0; i<10; i++){
      new Thread("" + i){
        public void run(){
          System.out.println("Thread: " + getName() + " running");
        }
      }.start();
    }
  }
}


注意,甚至如果线程是按顺序启动的(1,2,3等等)。他们可能也不会按顺序执行的,意味着线程1可能不是第一个打印出来的名字。这个就是为什么原则上线程是并行运行而不是顺序呢执行的原因了。这个JVM以及操作系统决定着线程执行的顺序。这个顺序每次在他们启动的时候都不会相同的。
以上就是创建以及启动一个Java线程的内容,更多相关内容请关注PHP中文网(www.php.cn)!


声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。

ホットAIツール

Undresser.AI Undress

Undresser.AI Undress

リアルなヌード写真を作成する AI 搭載アプリ

AI Clothes Remover

AI Clothes Remover

写真から衣服を削除するオンライン AI ツール。

Undress AI Tool

Undress AI Tool

脱衣画像を無料で

Clothoff.io

Clothoff.io

AI衣類リムーバー

AI Hentai Generator

AI Hentai Generator

AIヘンタイを無料で生成します。

ホットツール

メモ帳++7.3.1

メモ帳++7.3.1

使いやすく無料のコードエディター

SecLists

SecLists

SecLists は、セキュリティ テスターの究極の相棒です。これは、セキュリティ評価中に頻繁に使用されるさまざまな種類のリストを 1 か所にまとめたものです。 SecLists は、セキュリティ テスターが必要とする可能性のあるすべてのリストを便利に提供することで、セキュリティ テストをより効率的かつ生産的にするのに役立ちます。リストの種類には、ユーザー名、パスワード、URL、ファジング ペイロード、機密データ パターン、Web シェルなどが含まれます。テスターはこのリポジトリを新しいテスト マシンにプルするだけで、必要なあらゆる種類のリストにアクセスできるようになります。

PhpStorm Mac バージョン

PhpStorm Mac バージョン

最新(2018.2.1)のプロフェッショナル向けPHP統合開発ツール

AtomエディタMac版ダウンロード

AtomエディタMac版ダウンロード

最も人気のあるオープンソースエディター

ZendStudio 13.5.1 Mac

ZendStudio 13.5.1 Mac

強力な PHP 統合開発環境