Java Threadにおけるstart()とrun()の違い_動力ノードJava学院の整理


start()とrun()の違い説明
start():新しいスレッドを起動する役割をしています。新しいスレッドは対応するrun()メソッドを実行します。start()は再起動されません。
run()   : run()は普通のメンバー方法と同じように、呼び出しを繰り返すことができます。run()を単独で起動すると、現在のスレッドではrun()が実行されますが、新しいスレッドは起動されません。
コードで説明します。

class MyThread extends Thread{ 
  public void run(){
    ...
  } 
};
MyThread mythread = new MyThread();
mythread.startは新しいスレッドを立ち上げて、新しいスレッドの中でrun()の方法を実行します。
一方、mythread.run()はそのまま現在のスレッドでrun()方法を実行し、新しいスレッドを起動してrun()を実行しません。
start()とrun()の違い例
以下では、それらの違いを簡単な例で示します。ソースは以下の通りです 

 // Demo.java    
 class MyThread extends Thread{ 
   public MyThread(String name) {
     super(name);
   }
   public void run(){
     System.out.println(Thread.currentThread().getName()+" is running");
   } 
 }; 
 public class Demo { 
   public static void main(String[] args) { 
     Thread mythread=new MyThread("mythread");
     System.out.println(Thread.currentThread().getName()+" call mythread.run()");
     mythread.run();
     System.out.println(Thread.currentThread().getName()+" call mythread.start()");
     mythread.start();
   } 
 }
実行結果:

main call mythread.run()
main is running
main call mythread.start()
mythread is running
結果説明:
(01)Thread.current Thread().getName()は「現在スレッド」を取得するための名前です。現在のスレッドとは、cpuでスケジュール実行中のスレッドのことです。
(02)mythread.run()は、「メインスレッドmain」で呼び出され、このrun()方法は直接「メインスレッドmain」で実行されます。
(03)mythread.start()は「スレッドmythread」を起動し、「スレッドmythread」が起動したら、run()の方法を呼び出します。この時のrun()方法は「スレッドmysread」上で実行します。 
start()とrun()のソースコード(JDK 1.7.0_に基づく。40)
Thread.javaのstartの方法のソースコードは以下の通りです。 

public synchronized void start() {
  //       "    ",     !
  if (threadStatus != 0)
    throw new IllegalThreadStateException();
  //       ThreadGroup 
  group.add(this);
  boolean started = false;
  try {
    //   start0()    
    start0();
    //   started  
    started = true;
  } finally {
    try {
      if (!started) {
        group.threadStartFailed(this);
      }
    } catch (Throwable ignore) {
    }
  }
}
説明:start()は実際にローカル方法start 0()でスレッドを起動します。start 0()は新しいスレッドを実行します。新しいスレッドはrun()メソッドを呼び出します。

private native void start0(); 
Thread.java中run()のコードは以下の通りです。

public void run() {
  if (target != null) {
    target.run();
  }
}
説明:targetはRunnableオブジェクトです。run()とは、ThreadスレッドのRunnableのメンバーを直接呼び出すrunの方法であり、スレッドを新規に作成することはない。
以上、小编でご绍介したJava Threadのstart()とrun()の违いです。動力ノードJava学院は整理して、みんなに助けがあることを望んで、もしみんなはいかなる疑問があるならば、メッセージを下さい。ここでも私たちのサイトを応援してくれてありがとうございます。