私は1つが今日はご紹介コーラブルの最後の珍しい方法で、最後の1が呼び出し可能で、1は、Runnableインタフェースを実現することである、Threadクラスを継承することで、3つの方法がありますが、ほとんどの学校の生徒は、スレッドの共通を作成するためにあまりにも多くのスレッドを知っていると信じて。
まず、なぜSHOULD呼び出し可能インターフェース
そこ以来2つのインターフェイスの前に、なぜ我々はそれの3分の1を必要としますか?方法最初の二つに欠陥があるため、これは、私たちが達成した後、明らかに戻ってくる前の二つの方法を見てみましょうです。
class MyThread extends Thread{
@Override
public void run() {
System.out.println("继承Thread");
}
}
class MyRunnable implements Runnable{
@Override
public void run() {
System.out.println("实现了Runnable");
}
}
今、私たちは、これらの2つの方法は、処理後の構造を返すことができないと言うことですつまり、リターンが無効であることをrunメソッドの内部で観察します。しかし、呼び出し可能インターフェースの出現は、効果的にこの問題を解決することができます。答えは簡単です。それでは、どのように見てみましょう。
第二に、使用呼び出し可能インターフェース
1、スレッドを作成
のは、スレッドが実装呼び出し可能インターフェースを作成してみましょう。
class MyCallable implements Callable<Integer>{
@Override
public Integer call() throws Exception {
int retValue = 10;
return retValue;
}
}
どのようにそれを使用するには?前の二つの同じような?そこ私たちは、次のステップは使用することです、構築されたトラブルの少しであってもよいが、この時間は、私たちが来て、抗ので、私たちは、ないので、簡単に理解するために、単語の直接の使用を紹介します。
2つのスレッド
スレッドのコンストラクタで見てみましょう:
public Thread() {}
public Thread(Runnable target) {}
Thread(Runnable target, AccessControlContext acc) {}
public Thread(ThreadGroup group, Runnable target) {}
public Thread(String name) {}
public Thread(ThreadGroup group, String name) {}
public Thread(Runnable target, String name) {}
public Thread(ThreadGroup group, Runnable target, String name) {}
public Thread(ThreadGroup group, Runnable target, String name,
long stackSize) {}
私はこのソースjdk1.8から取られている、リスト9つのコンストラクタの合計が、注意深い観察が見つけることができる、ではないコンストラクタは前に簡単な方法の種類に応じてスレッドを作成しないことを意味呼び出し可能インターフェースを渡すことができます。この時間は、どのようにそれを行うには?彼らは、思考の方法を変更する必要があります。
スレッドは戻り値を持つことができますので、あなたが未来のインターフェース機能を考えることができれば、私は知らない、私たちはクエリをアンカー:
//1、FutureTask实现了RunnableFuture
public class FutureTask<V> implements RunnableFuture<V>
//2、RunnableFuture又是继承了Runnable和Future
public interface RunnableFuture<V> extends Runnable, Future<V>
//3、Future接口的常用方法
public interface Future<V> {
boolean cancel(boolean mayInterruptIfRunning);
boolean isCancelled();
boolean isDone();
V get() throws InterruptedException, ExecutionException;
V get(long timeout, TimeUnit unit)
throws InterruptedException, ExecutionException, TimeoutException;
}
上記のコードから、我々は実行可能スレッドの両方の特性、実装クラスFutureTaskを見ることができ、また、特徴的な未来を持っていると、機能を返すことができます。だから我々は、コーラブルのFutureTaskの使用を実装するには、このクラスを使用することができます。
class MyCallable implements Callable<Integer>{
@Override
public Integer call() throws Exception {
System.out.println(Thread.currentThread().getName()+"进入callable");
int retValue = 10;
return retValue;
}
}
public class Test3 {
public static void main(String[] args) throws Exception{
FutureTask<Integer> task = new FutureTask<>(new MyCallable());
Thread thread = new Thread(task,"线程A");
thread.start();
//线程运行结束,说明Callable接口的方法已经完成,此时我们就可以获取返回值
System.out.println("Callable返回的结果是:"+task.get());
}
}
これは、使用する基本的な方法です。今後のコースは、他にも多くの方法を提供しています。
(1)は、ミッションに失敗したキャンセルするfalseを返す場合、タスクが正常に真のリターンをキャンセルした場合、タスクをキャンセルする方法をキャンセルします。
MayInterruptIfRunningパラメータは、実行されるが、完了していない、真設定した場合、タスクが実行される過程でキャンセルすることができるタスクをキャンセルできるようにするかどうかを示します。タスクが完了している場合は、関係なく、mayInterruptIfRunningが真か偽である、タスクがキャンセルされた場合、である。この方法は確かにリターン偽は、falseを返します。
タスクが実行されている場合mayInterruptIfRunningがtrueに設定されている場合、それは、trueを返します
falseに設定すると、偽が返されMayInterruptIfRunning。
タスクが実行されていない場合は、関係なく、mayInterruptIfRunningが真か偽である、確かにtrueを返します。
(2)isCancelledメソッドは、タスクが正常に完了する前に、成功がキャンセルされた場合、タスクが正常にキャンセルされたかどうかを示し、それはtrueを返します。
タスクが終了した場合(3)isDone方法がtrueを返し、タスクが完了したかどうかを示します。
タスクが返す前に終了するまで(4)のget()の結果を得るために使用する方法を、この方法は、障害物が生成されます、それは待機します。
(5)GET(長いタイムアウト、TimeUnitで単位)指定した時間が、結果を取得していない場合の結果を得るために使用されるが、直接NULLを返します。
基本的にはそれはそれです。実際には、多くの場合、使用するExecutorServiceのと合わせ、そして今、私たちは例を見て:
public class Test3 {
public static void main(String[] args) throws Exception{
ExecutorService executor = Executors.newCachedThreadPool();
FutureTask<Integer> futureTask = new FutureTask<Integer>
(new MyCallable());
executor.submit(futureTask);
executor.shutdown();
//线程运行结束,说明Callable接口的方法已经完成,此时我们就可以获取返回值
System.out.println("Callable返回的结果是:"+futureTask.get());
}
}
使用方法は、2それほど一般的です。呼び出し可能インターフェースであるため、ソースコード解析は意味がありませんので。OK、この導入に呼び出し可能インターフェースのために、まずここ。
ご質問がある場合も批判を招きました。