I.背景
時間以上のビジネス、並びにプログラム、マルチスレッドの最終用途の効率を改善するために1。私は、マルチスレッド達成することが呼び出し可能なを使用しています。ここで私はシンプルで小さな栗がバーの下にある使用します。
二、呼び出し可能なプロフィール
Javaの1.、2つの方法がありますスレッドを作成、1は1つが、Runnableインタフェースを実現することである、Threadクラスの継承です。しかしながら、これらの2つの方法の欠点は、実行タスクのスレッドの終了時に、結果が得られないことがあります。私たちは、一般的にのみ、タスクの結果を得る目的を達成するために共有変数または共有メモリとスレッド間通信手段を使用しています。
2.Javaでは、また、タスクの結果へのアクセスを達成するための操作上の使用呼び出し可能と未来を提供します。呼び出し可能なタスクは、農産物の結果を実行するために、そして未来の結果を得るために。
かどうか3.Callableインターフェイスは、ビューのソースコードに、Runnableインタフェースに似ている、あなたは次のように定義された呼び出し可能インターフェースを見ることができます:
@FunctionalInterface
public interface Callable<V> {
/**
* Computes a result, or throws an exception if unable to do so.
*
* @return computed result
* @throws Exception if unable to compute a result
*/
V call() throws Exception;
}
これは、一般的なメソッド呼び出しの戻り値Vと、その中に、Runnableインタフェースが異なるを見ることができます
第三に、小さな栗
1.コード
public class Test0002 {
public static void main(String[] args) throws ExecutionException, InterruptedException {
ExecutorService executorService = Executors.newCachedThreadPool();
Future<String> submit = executorService.submit(new TaskCallable());
System.out.println("执行任务开始(主线程)。。。");
String result = submit.get();
System.out.println(result);
System.out.println("执行任务结束(主线程)。。。");
}
static class TaskCallable implements Callable<String> {
@Override
public String call() throws Exception {
System.out.println("执行任务开始(子线程)。。。");
Thread.sleep(5000);
System.out.println("执行任务结束(子线程)。。。");
return "chenmingxu";
}
}
}
2.結果
执行任务开始(主线程)。。。
执行任务开始(子线程)。。。
执行任务结束(子线程)。。。
chenmingxu
执行任务结束(主线程)。。。
3.分析します
プログラムは、それがブロックされないということである前に3.1.submit.get()は、メインプログラムであるが、それだけですべての結果を取得した後、メインプログラムが開始されますブロックされた後にプログラムが発生します。
3.2。私たちが抽出された別々のコードの結果を得るために別のスレッドを開くことができるように、あなたはメインスレッドで互いに独立してプログラムのパフォーマンスを向上させることができそうという。
4.future一般的な方法
VのGETは():何の結果が利用できない場合は、非同期計算が完了するまで、このメソッドはブロックされます、非同期実行の結果を取得します。
V(長いタイムアウト、TimeUnitでユニット)GET:ブロッキング時間が設定されたタイムアウト時間を超えた場合には結果が利用可能でない場合、非同期実行結果を取得し、この方法はブロックしますが、時間制限があり、この方法は、例外をスローします。
ブールisDone():タスクの実行が終了すると、正常か異常時のいずれかで終了またはキャンセルした場合、trueを返します。
ブールisCanceller():タスクが完了した場合、前者が解除され、それはtrueを返します。
(ブールmayInterruptRunning)キャンセルブール値: falseのタスクが開始されていない場合は、キャンセル実行(...)メソッドの戻りを、タスクがすでに開始されている場合、実行はこのタスクを実行する(true)メソッドをキャンセルするタスクを停止しようとするスレッドを中断します、あなたが成功した停止した場合、trueを返す;タスクが開始されたとき、実行キャンセル(偽)メソッドは、タスク実行中のスレッド(完了までの通常の実行にスレッド)には影響を与えませんし、falseを返します。タスクが完了したとき、実行はキャンセル(...)メソッドはfalseを返します。パラメータをmayInterruptRunningは実行スレッドを中断するかどうかを示します。
タスクの実行結果の完全な量を取得し(1)タスク完了(3)を実行するかどうかを判断するために、タスクの実行(2)を中断することができ:我々はまた、分析の方法によって、実際に未来は3つの機能を提供することを知っています。
第四に、例
1.コード
public class Test0002 {
public static void main(String[] args) {
ExecutorService executorService = Executors.newCachedThreadPool();
Future<String> submit = executorService.submit(new TaskCallable());
System.out.println("执行任务开始(主线程)。。。");
new Thread(new Runnable() {
@Override
public void run() {
String result = null;
try {
result = submit.get();
} catch (Exception e) {
e.printStackTrace();
}
System.out.println(result);
}
}).start();
System.out.println("执行任务结束(主线程)。。。");
executorService.shutdown();
}
static class TaskCallable implements Callable<String> {
@Override
public String call() throws Exception {
System.out.println("执行任务开始(子线程)。。。");
String name = "chenmingxu";
System.out.println("执行任务结束(子线程)。。。");
return testDemo(name);
}
private String testDemo(String name) throws InterruptedException {
Thread.sleep(5000);
return name;
}
}
}
2.結果
执行任务开始(主线程)。。。
执行任务开始(子线程)。。。
执行任务结束(子线程)。。。
执行任务结束(主线程)。。。
chenmingxu
3.分析します
3.1。私たちは、上記の結果から見ることができるだけでなく、私たちのメインスレッドと子スレッドの実行がお互いに影響されません。
第五に、の終わり
1.Alwaysは、信仰を守ります!