Java之Callable和Runnable
1 接口定義
1) Callable接口
public interface Callable<V> {
V call() throws Exception;
}
2) Runnable接口
public interface Runnable {
public abstract void run();
}
2 不同點和相同點
1)相同點
都是接口,都可編寫多線程程序,都是調(diào)用Thread.start()啟動線程
2)不同點
Callable可以返回執(zhí)行結(jié)果,是個泛型,與Future、FutureTask配合可以通過FutureTask.get()獲取異步執(zhí)行的結(jié)果,但是Runnable不可以。
Callable里面有取消這個任務(wù),而且異??梢酝鈷?,但是Runnable異常只能內(nèi)部run消化。
FutureTask.get()得到異步執(zhí)行的結(jié)果,此方法會阻塞主進(jìn)程的繼續(xù)往下執(zhí)行。
3 Callable測試用例
import java.util.Random;
import java.util.concurrent.Callable;
import java.util.concurrent.ExecutionException;
import java.util.concurrent.FutureTask;
public class TestCallableAndFuture {
public static void main(String[] args) {
//構(gòu)建Callable
Callable<String> callable = new Callable<String>() {
@Override
public String call() throws Exception {
Thread.sleep(2000);
return "chenyu callable finish";
}
};
//構(gòu)建FutureTask
FutureTask<String> futureTask = new FutureTask<>(callable);
//運(yùn)行線程
new Thread(futureTask).start();
try {
System.out.println("chenyu begin");
System.out.println(futureTask.isDone());
//futureTask.cancel(true);
if (!futureTask.isCancelled()) {
System.out.println(futureTask.get());
System.out.println(futureTask.isDone());
System.out.println("chenyu end");
} else {
System.out.println("the thread is cancel");
}
} catch (InterruptedException e) {
e.printStackTrace();
} catch (ExecutionException e) {
e.printStackTrace();
}
}
}
4 運(yùn)行結(jié)果
如果注釋掉// futureTask.cancel(true)運(yùn)行結(jié)果如下
chenyu begin
false
chenyu callable finish
true
chenyu end
如果不注釋掉futureTask.cancel(true)運(yùn)行結(jié)果如下
chenyu begin
false
the thread is cancel
作者:chen.yu
深信服三年半工作經(jīng)驗,目前就職游戲廠商,希望能和大家交流和學(xué)習(xí),
微信公眾號:編程入門到禿頭 或掃描下面二維碼
零基礎(chǔ)入門進(jìn)階人工智能(鏈接)