JUC并发编程学习笔记(六)Callable(简单)
Callable(簡(jiǎn)單)
callable接口和runnable接口類似,都是為了執(zhí)行另外一條線程而設(shè)計(jì)的,區(qū)別是Runnable不會(huì)返回結(jié)果也不會(huì)拋出異常。
1、可以有返回值
2、可以拋出異常
3、方法不同;run()/call();
Runnable
實(shí)現(xiàn)Runnable接口,重寫run方法,無返回值
//原線程
class RunnableThread implements Runnable{
@Override
public void run() {
}
}
Callable
實(shí)現(xiàn)Callable接口,重寫call方法,有返回值,可在實(shí)現(xiàn)接口時(shí)設(shè)定
//callable線程
class CallableThread implements Callable<String>{
@Override
public String call() throws Exception {
return null;
}
}
Callable中泛型的參數(shù)等于方法的返回類型
啟動(dòng)callable
Thread類中沒有填入callable接口的重載方法,所以我們需要通過適配類完成操作
通過查找Runnable接口的實(shí)現(xiàn)類,能夠發(fā)現(xiàn)有一個(gè)FutureTask中提供了Callable參數(shù)的構(gòu)造方法
所以,可以通過FutureTask來作為一個(gè)中間人的角色使用線程運(yùn)行callable的實(shí)現(xiàn)類。
具體代碼
package org.example.callable;
import java.util.concurrent.Callable;
import java.util.concurrent.ExecutionException;
import java.util.concurrent.FutureTask;
public class CallableTest {
public static void main(String[] args) {
// new Thread(()->{new Runnable()}).start();
// new Thread(()->{new FutureTask<V>()}).start();
// new Thread(()->{new FutureTask<V>( Callable )}).start();
CallableThread thread = new CallableThread();//怎樣啟動(dòng)Callable
FutureTask task = new FutureTask(thread);//適配類
new Thread(task,"A").start();//正常打印兩個(gè)call,但是這邊只會(huì)打印一個(gè),結(jié)果會(huì)被緩存,提高效率
new Thread(task,"B").start();
try {
String o = (String) task.get();//get方法可能產(chǎn)生阻塞,耗時(shí)操作時(shí);通過異步操作或者將它放在最后使用
System.out.println(o);
} catch (InterruptedException e) {
throw new RuntimeException(e);
} catch (ExecutionException e) {
throw new RuntimeException(e);
}
}
}
//callable線程
class CallableThread implements Callable<String>{
@Override
public String call() throws Exception {
System.out.println("call");
return "cals";
}
}
細(xì)節(jié)
1、為了提高效率所以有緩存
2、耗時(shí)操作時(shí),獲取callable的返回值可能會(huì)產(chǎn)生對(duì)該方法調(diào)用實(shí)例的線程阻塞
總結(jié)
以上是生活随笔為你收集整理的JUC并发编程学习笔记(六)Callable(简单)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Redis宕机恢复
- 下一篇: c# char unsigned_dll