ホームページ  >  記事  >  Java  >  Java スレッドを作成して開始する

Java スレッドを作成して開始する

黄舟
黄舟オリジナル
2017-02-28 10:29:571445ブラウズ

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 までご連絡ください。