Java之Callable和Runnable
生活随笔
收集整理的這篇文章主要介紹了
Java之Callable和Runnable
小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.
1 接口定義?
1) Callable接口
public interface Callable<V> {V call() throws Exception; }2) Runnable接口
public interface Runnable {public abstract void run(); }?
?
2 不同點(diǎn)和相同點(diǎn)
1)相同點(diǎn)
都是接口,都可編寫多線程程序,都是調(diào)用Thread.start()啟動線程
?
2)不同點(diǎn)
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)建CallableCallable<String> callable = new Callable<String>() {@Overridepublic String call() throws Exception {Thread.sleep(2000);return "chenyu callable finish";}};//構(gòu)建FutureTaskFutureTask<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?
總結(jié)
以上是生活随笔為你收集整理的Java之Callable和Runnable的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Java之new一个对象简单过程
- 下一篇: Java之多线程里面的锁理解以及sync