メソッドがあるとしましょうdoWork()
。(メインスレッドではなく)別のスレッドから呼び出すにはどうすればよいですか。
メソッドがあるとしましょうdoWork()
。(メインスレッドではなく)別のスレッドから呼び出すにはどうすればよいですか。
回答:
Runnable
インターフェイスを実装するクラスを作成します。実行するコードをrun()
メソッドに配置しRunnable
ます。これは、インターフェイスに準拠するために記述する必要があるメソッドです。「メイン」スレッドで、新しいThread
クラスを作成し、コンストラクタにのインスタンスを渡してRunnable
、それを呼び出しますstart()
。start
魔法のように新しいスレッドを作成し、run
その新しいスレッドでメソッドを呼び出すようにJVMに指示します。
public class MyRunnable implements Runnable {
private int var;
public MyRunnable(int var) {
this.var = var;
}
public void run() {
// code in the other thread, can reference "var" variable
}
}
public class MainThreadClass {
public static void main(String args[]) {
MyRunnable myRunnable = new MyRunnable(10);
Thread t = new Thread(myRunnable)
t.start();
}
}
開始するには、Javaの同時実行チュートリアルをご覧ください。
メソッドが頻繁に呼び出される場合、これは高価な操作であるため、毎回新しいスレッドを作成する価値がない場合があります。ある種のスレッドプールを使用するのがおそらく最善でしょう。見ていFuture
、Callable
、Executor
中クラスjava.util.concurrent
のパッケージを。
run()
メソッドはパラメータを取らないため、変数を渡すことはできません。コンストラクタで渡すことをお勧めします-私はそれを示すために私の答えを編集します。
new Thread() { public void run() {myMethod();}}.start();
方法を知っています、それが最短ですか?
Runnable
は拡張するクラスですRunnable
。そして、それを行ったので、インスタンス化されたオブジェクトに状態を渡す独自のコンストラクタがあります。
Thread t1 = new Thread(new Runnable() {
@Override
public void run() {
// code goes here.
}
});
t1.start();
または
new Thread(new Runnable() {
@Override
public void run() {
// code goes here.
}
}).start();
または
new Thread(() -> {
// code goes here.
}).start();
または
Executors.newSingleThreadExecutor().execute(new Runnable() {
@Override
public void run() {
myCustomMethod();
}
});
または
Executors.newCachedThreadPool().execute(new Runnable() {
@Override
public void run() {
myCustomMethod();
}
});
run()
ますか?
Java 8では、1行のコードでこれを行うことができます。
メソッドがパラメーターを取らない場合は、メソッド参照を使用できます。
new Thread(MyClass::doWork).start();
それ以外の場合は、ラムダ式でメソッドを呼び出すことができます。
new Thread(() -> doWork(someParam)).start();
->
どういう意味ですか?
Celery task queue
ですが、非同期のものに使用するのはなぜですか
少し前に、JDK5 executorサービスを使用して特定のプロセスをバックグラウンドで実行する単純なユーティリティクラスを作成しました。doWork()の戻り値は通常voidであるため、このユーティリティクラスを使用してバックグラウンドで実行することができます。
このユーティリティをドキュメント化したこの記事を参照してください。
Java 8以上を使用している場合はrunAsync
、クラスCompletableFutureのメソッドを使用できます
CompletableFuture.runAsync(() -> {...});
結果を返す必要がある場合は、supplyAsync
代わりに使用してください
CompletableFuture.supplyAsync(() -> 1);