Kcits:
私は別のスレッドから一つのスレッドにキューを追加する方法を見つけようとしています。
ここでは例を示します。
public void actionPerformed(ActionEvent e) {
System.out.println("something happened.");
}
私はこの方法は信じてactionPerformed
、私は別のスレッドにあることをスケジュールする、常にEDTに実行されますが、メソッド内のコードは何もスイングが関連していないからです。
あなたのような、EDTにタスクをスケジュールすることを可能にする方法があります:
SwingUtilities.invokeLater(new Runnable() {
public void run() {
//insert some code that does something in EDT
}
});
同じことを行うにはどのような方法がありますが、通常のスレッドのために?
ジョンKugelman:
あなたが使用したいものをバックグラウンドスレッドには、特定の好みを持っていない場合は、試すForkJoinPool
共通プールを。
静的には、
commonPool()
ほとんどのアプリケーションのために利用可能かつ適切です。共通プールは、任意で使用されForkJoinTask
、明示的に指定されたプールに提出されません。一般的なプールを使用すると、通常(そのスレッドがゆっくり不使用期間中に再生し、その後の使用時に回復される)リソースの使用量を減少させます。
あなたは仕事に多くの異なる方法を提出することができます。私は経由でそれを行うことをお勧めしCompletableFuture
ているあなたの仕事の状況や結果を確認するための方法を提供します。そのすべてのxxxAsync()
メソッドは、フォーク加入共通プールにタスクを提出します。
あなたは結果を気にしない場合は、単純に呼び出すことができrunAsync()
ファイア・アンド・フォーゲットスタイル:
CompletableFuture.runAsync(() -> {
System.out.println("something happened.");
});
それとも、オフスレッド値を計算したい場合は、ジョブが完了アクションを取るために、連鎖メソッドを使用することができます。
CompletableFuture.supplyAsync(() -> {
// expensive computation
return result;
})
.whenComplete((result, exception) -> {
if (exception == null) {
System.out.println("result is " + result);
}
else {
// something went wrong
exception.printStackTrace();
}
});