thread.run()
代わりにJavaを呼び出すのはthread.start()
いつですか?
t.run()
、実行したいとき、t
「現在のスレッド上のタスクを、そしてt.start()
実行したいとき、t
スレッド上のタスク」をt
自分自身。それとも実際のユースケースを求めていますか?
start()
です!私のように...このメソッドは公開しないでください!
thread.run()
代わりにJavaを呼び出すのはthread.start()
いつですか?
t.run()
、実行したいとき、t
「現在のスレッド上のタスクを、そしてt.start()
実行したいとき、t
スレッド上のタスク」をt
自分自身。それとも実際のユースケースを求めていますか?
start()
です!私のように...このメソッドは公開しないでください!
回答:
決して。run()を直接呼び出すと、通常のメソッド呼び出しと同じように、同じスレッドでコードを同期的に実行します。
フォーム取らコードスタイルのJavaスレッドよくある質問:
Q:スレッドのstart()メソッドとrun()メソッドの違いは何ですか?
A:Threadクラスの個別のstart()およびrun()メソッドは、スレッド化されたプログラムを作成する2つの方法を提供します。start()メソッドは、新しいスレッドの実行を開始し、run()メソッドを呼び出します。start()メソッドはすぐに戻り、新しいスレッドは通常、run()メソッドが戻るまで続きます。
Threadクラスのrun()メソッドは何もしないので、サブクラスは2番目のスレッドで実行するコードでメソッドをオーバーライドする必要があります。スレッドがRunnable引数でインスタンス化されている場合、スレッドのrun()メソッドは、代わりに新しいスレッドでRunnableオブジェクトのrun()メソッドを実行します。
スレッド化されたプログラムの性質によっては、スレッドのrun()メソッドを直接呼び出すと、start()メソッドを介して呼び出す場合と同じ出力が得られますが、後者の場合、コードは実際には新しいスレッドで実行されます。
thread's run() method executes the run() method of the Runnable object in the new thread instead.
それは真実ではありません(または少なくとも私のJava 8ソースコードはそうでないと伝えています)が、残念ながらリンクが壊れているように見えるので、代わりにここで間違いを報告します。
thread.run()
なく、の代わりに呼び出すユースケースについて尋ねることですthread.start()
。
これはすでに言及されていますが、明確に言えば、run()メソッドを呼び出すためだけに新しいThreadオブジェクトを作成することは不必要にコストがかかり、重大な赤旗になるはずです。それは、RunnableをIMPLとを作成するためのより良い、より多くのデカップリングのデザインになりますどちらか()を呼び出し、それのことが目的の動作、または(b)はそのRunnableを持つ新しいスレッドを作成し、スレッドを開始するかどう直接run()メソッドを。
さらに良いことに、さらに分離するために、Executor
JDK 5以降のインターフェースとフレームワークをチェックしてください。これにより、一言で言えば、タスクの実行(Runnableインスタンス)の実行方法(現在のスレッドでRunnableを実行する可能性のあるExecutor実装、新しいスレッドで、プールの既存のスレッドを使用して)から切り離すことができます。そして何も)。
Threadクラスの個別のstart()
およびrun()
メソッドは、スレッド化されたプログラムを作成する2つの方法を提供します。start()
この方法は、新しいスレッドの実行を開始して呼び出すrun()
方法を。start()
この方法はすぐに戻り、新たなスレッドが正常になるまで続けrun()
メソッドが返します。
Threadクラスのrun()
メソッドは何もしないので、サブクラスは2番目のスレッドで実行するコードでメソッドをオーバーライドする必要があります。スレッドがRunnable引数でインスタンス化されている場合、スレッドのrun()
メソッドはrun()
代わりに新しいスレッドでRunnableオブジェクトのメソッドを実行します。
スレッド化されたプログラムの性質によっては、Thread run()
メソッドを直接呼び出すと、start()
メソッドを介して呼び出すのと同じ出力が得られますが、後者の場合、コードは実際には新しいスレッドで実行されます。
The start() method returns immediately and the new thread normally continues until the run() method returns.
それが自分自身から呼び出されたとして、実行start()
がrun()
継続する理由がすぐに戻る場合start()
質問が「runメソッドの代わりにスレッド開始メソッドが直接呼び出される理由」である場合、以下のサンプルコードで答えました。それが明確になることを願っています。以下の例では:
/*
By calling t1.start(),
we are getting the main calling thread returned immediately
after the t1.start() called and is ready to proceed for other
operations.And the thread t1 starts executing the run method of the object r.
Hence the the output will be:
I am the main thread , i created thread t1 and had it execute run method, which is currently looping from 0 to 1000000
I am done executing run method of testThread
*/
/* If we call t1.run() instead of t1.start(), (just replace t1.start() with t1.run() in the code for testing)
its like a regular method call and the main thread will not return until the run method completes,
hence the output will be:
I am done executing run method of testThread
I am the main thread , i created thread t1 and had it execute run method, which is currently looping for i to 1000000
*/
class testThread implements Runnable{
public void run()
{
for(int i=0;i<1000000;i++){} //a simple delay block to clarify.
System.out.println("I am done executing run method of testThread");
}
}
public class mainClass{
public static void main(String [] args)
{
testThread r = new testThread();
Thread t1 = new Thread(r);
t1.start(); /* Question is: can we call instead t1.run() */
System.out.println("I am the main thread , i created thread t1 and had it execute run method, which is currently looping for i to 1000000");
}
}
他のメソッドと同じようにrun()の内容を実行したい場合。もちろん、スレッドを開始しないこと。
開始と実行のメソッドの使用法(同期と非同期)がわかっていると仮定します。runメソッドは、機能をテストするためだけに使用できます。
さらに、状況によっては、runメソッドとstartメソッドが呼び出される2つの異なるオブジェクトを呼び出すことで、同じスレッドクラスを同期と非同期の機能要件を持つ2つの異なる場所で使用できます。
少なくともJVM 1.6では、チェックが少しあり、実行はネイティブに呼び出されます。
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();
group.add(this);
start0();
if (stopBeforeStart) {
stop0(throwableFromStop);
}
}
private native void start0();
public class TestClass implements Runnable {
public static void main(String[] args) {
TestClass tc = new TestClass();
Thread t1 = new Thread(tc);
System.out.println("Before Starting Thread " + Thread.currentThread().hashCode());
t1.start();
System.out.println("After Starting Thread " + Thread.currentThread().hashCode());
}
@Override
public void run() {
System.out.println("TestClass Run method is Running with thread " + Thread.currentThread().hashCode());
}
}