Java Threadにおけるstart()とrun()の違い_動力ノードJava学院の整理
start()とrun()の違い説明
start():新しいスレッドを起動する役割をしています。新しいスレッドは対応するrun()メソッドを実行します。start()は再起動されません。
run() : run()は普通のメンバー方法と同じように、呼び出しを繰り返すことができます。run()を単独で起動すると、現在のスレッドではrun()が実行されますが、新しいスレッドは起動されません。
コードで説明します。
一方、mythread.run()はそのまま現在のスレッドでrun()方法を実行し、新しいスレッドを起動してrun()を実行しません。
start()とrun()の違い例
以下では、それらの違いを簡単な例で示します。ソースは以下の通りです
(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の方法のソースコードは以下の通りです。
以上、小编でご绍介したJava Threadのstart()とrun()の违いです。動力ノードJava学院は整理して、みんなに助けがあることを望んで、もしみんなはいかなる疑問があるならば、メッセージを下さい。ここでも私たちのサイトを応援してくれてありがとうございます。
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学院は整理して、みんなに助けがあることを望んで、もしみんなはいかなる疑問があるならば、メッセージを下さい。ここでも私たちのサイトを応援してくれてありがとうございます。