web-dev-qa-db-ja.com

匿名スレッドクラスを開始する方法

次のコードスニペットがあります。

public class A {
    public static void main(String[] arg) {
        new Thread() {
            public void run() {
                System.out.println("blah");
            }
        };
    }
}

ここで、スレッドクラスのインスタンスを作成せずに、スレッドのstart()メソッドを呼び出す方法を教えてください。

59
noMAD

すでに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();
137
Jon Skeet

匿名クラスは指定されたクラスを拡張するため、変数に保存できます。

例えば。

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();
14
Dunes

これがあなたが尋ねているものであるかどうかは確かではありませんが、次のようなことができます:

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();

代わりに、Threadrun()メソッドをオーバーライドして、新しいスレッドで実行されるターゲットRunnableを注入します。これはより良いパターンです。

6
Gray

Start()を呼び出すだけです

new Thread()
{
    public void run() {
        System.out.println("blah");
    }
}.start();
3
Jeremiah Orr

new式全体がオブジェクト参照であるため、メソッドを呼び出すことができます。

public class A {
    public static void main(String[] arg)
    {
        new Thread()
        {
            public void run() {
                System.out.println("blah");
            }
        }.start();
    }
}
3
Dave Costa

追加:ラムダを使用して構文を簡素化できるようになりました。要件:Java 8+

public class A {
    public static void main(String[] arg)
    {
        Thread th = new Thread(() -> {System.out.println("blah");});
        th.start();
    }
}
2
recolic

この質問の答えに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のコード を参照してください。

0
entpnerd

将来の参考のためにこれをここに残しますが、それも答えです。

new Thread(()-> whatever())。start();

0
Kristoff