startメソッドとrunメソッドの比較
私を含め多くの人々は以前考えられていた走行を持っているとメソッドがスレッドを開始することができ、かつ両方の機能が類似しているし、それらがある間、これは、学習の過程で間違っていることを認識し始める非常に異なるの。デモコードを見てください:
/**
* @author Chen
* @Description start()和run()方法比较
* @create 2019-11-05 22:01
*/
public class StartAndRunMethod {
public static void main(String[] args) {
//使用run方法
Runnable runnable = ()-> System.out.println(Thread.currentThread().getName());
runnable.run();
//使用start方法
new Thread(runnable).start();
}
}
出力:
main
Thread-0
私たちは、見ることができるスレッドのrunメソッドがメインスレッドで、実行方法は、新しい子スレッドで開始します。
startメソッドの解釈
我々は、すべてのスタートは本当にstartメソッドの実行中、1はメインスレッドは、他のは、新しい子スレッドで、2つのスレッドを含むことである実際には、新しいスレッドを開始することであることを知ってstartメソッドが呼び出されたときに、いない子スレッドすぐに起動しますが、子スレッドが状態を入力するために、CPUに加えて、いくつかのリソースを取得します、CPUは、コールを待ち。呼び出すときのためのように、これは決定我々はできるが、決定するスレッドスケジューラではありません。だから、いくつかの遅いスレッドはスレッドのstartメソッドを実行するためにそこに開始している方法は、より後に呼び出され起動することがあります。
私たちは二回繰り返し何と呼ばれるときにstartメソッドはどうなりますか?
例外ないIllegalThreadStateException(違法なスレッド状態を)投げるだろう、実際には、スレッドは、実装されている場合、実行可能状態になり、一度終了し、状態の終わりに入り、戻って戻りません。
次はするで詳しく見ていくstart()
ことはやった最後に実行するどのようなプロセスを理解します。
public synchronized void start() {
/**
* This method is not invoked for the main method thread or "system"
* group threads created/set up by the VM. Any new functionality added
* to this method in the future may have to also be added to the VM.
*
* A zero status value corresponds to state "NEW".
*/
if (threadStatus != 0)
throw new IllegalThreadStateException();
/* Notify the group that this thread is about to be started
* so that it can be added to the group's list of threads
* and the group's unstarted count can be decremented. */
group.add(this);
boolean started = false;
try {
start0();
started = true;
} finally {
try {
if (!started) {
group.threadStartFailed(this);
}
} catch (Throwable ignore) {
/* do nothing. If start0 threw a Throwable then
it will be passed up the call stack */
}
}
}
ではstart()
最初にチェックスレッドの状態、判断がthreadStatus
0に等しくない場合、その判断が2回実施され、新たなスタートのスレッドではないstart()
スロー理由。(デフォルトの状態が0であるとき、オンラインChenggangギャングが初期化されます)
そして、この行動に参加し、その後START0のネイティブメソッドを実行するスレッドグループを作りました。
通訳runメソッド
実際には、実行方法は、コードのわずか3行、比較的簡単である:ターゲットは、着信インターフェイスは、コンテンツ、又は方法の実施に関する着信ランの内容を書き換えるrunメソッドの実装に、空ではない場合。
@Override
public void run() {
if (target != null) {
target.run();
}
}
だから我々は、runメソッドを実行すると、それは同様に私たち自身を書く一般的な方法としてだろう、と、そうコンソールがメインスレッドでプリントアウトします。
だから我々は、runメソッドへの間接呼び出しと呼ばれる直接runメソッドを呼び出すことはできません新しいスレッドを開始したいのですが、方法を開始する必要があります。