次のコードスニペットがあります。
public class A {
public static void main(String[] arg) {
new Thread() {
public void run() {
System.out.println("blah");
}
};
}
}
ここで、スレッドクラスのインスタンスを作成せずに、スレッドのstart()
メソッドを呼び出す方法を教えてください。
すでにThreadクラスのインスタンスを作成している-あなたはそれで何もしていません。 couldローカル変数を使用せずにstart()
を呼び出します:
new Thread()
{
public void run() {
System.out.println("blah");
}
}.start();
...しかし、個人的に私は通常それをローカル変数に割り当て、あなたが望む他のものを何でもし(例えば名前を設定するなど)、それを開始します:
Thread t = new Thread() {
public void run() {
System.out.println("blah");
}
};
t.start();
匿名クラスは指定されたクラスを拡張するため、変数に保存できます。
例えば。
Thread t = new Thread()
{
public void run() {
System.out.println("blah");
}
};
t.start();
または、すぐに作成したオブジェクトでstartメソッドを呼び出すだけです。
new Thread()
{
public void run() {
System.out.println("blah");
}
}.start();
// similar to new Thread().start();
個人的には、スレッドではなくRunnableの匿名インスタンスを作成することを常にお勧めします。誤ってメソッドシグネチャを誤って取得した場合、コンパイラが警告を表示します(匿名クラスでは、匿名クラスでは定義できないため、新しい非プライベートメソッド)。
例えば
new Thread(new Runnable()
{
@Override
public void run() {
System.out.println("blah");
}
}).start();
これがあなたが尋ねているものであるかどうかは確かではありませんが、次のようなことができます:
new Thread() {
public void run() {
System.out.println("blah");
}
}.start();
無名クラスの最後にあるstart()
メソッドに注目してください。スレッドオブジェクトを作成しますが、実際に別の実行中のスレッドを取得するには、オブジェクトを開始する必要があります。
匿名のThread
クラスを作成するよりも、匿名のRunnable
クラスを作成することをお勧めします。
new Thread(new Runnable() {
public void run() {
System.out.println("blah");
}
}).start();
代わりに、Thread
のrun()
メソッドをオーバーライドして、新しいスレッドで実行されるターゲットRunnable
を注入します。これはより良いパターンです。
Start()を呼び出すだけです
new Thread()
{
public void run() {
System.out.println("blah");
}
}.start();
new
式全体がオブジェクト参照であるため、メソッドを呼び出すことができます。
public class A {
public static void main(String[] arg)
{
new Thread()
{
public void run() {
System.out.println("blah");
}
}.start();
}
}
追加:ラムダを使用して構文を簡素化できるようになりました。要件:Java 8+
public class A {
public static void main(String[] arg)
{
Thread th = new Thread(() -> {System.out.println("blah");});
th.start();
}
}
この質問の答えにJavaのExecutorフレームワークについて言及していないことに驚いています。 Executorフレームワークの主なセールスポイントの1つは、低レベルのスレッドに対処する必要がないことです。代わりに、 ExecutorService sの抽象化のより高いレベルを扱っています。そのため、スレッドを手動で開始する代わりに、Runnableをラップするexecutorを実行するだけです。シングルスレッドエグゼキューターを使用すると、作成したRunnable
インスタンスは内部的にラップされ、スレッドとして実行されます。
import Java.util.concurrent.ExecutorService;
import Java.util.concurrent.Executors;
// ...
ExecutorService threadExecutor = Executors.newSingleThreadExecutor();
try {
threadExecutor.execute(
new Runnable() {
@Override
public void run() {
System.out.println("blah");
}
}
);
} finally {
threadExecutor.shutdownNow();
}
便宜上、 JDoodleのコード を参照してください。
将来の参考のためにこれをここに残しますが、それも答えです。
new Thread(()-> whatever())。start();