Java中Runnable與Callable接口的區(qū)別詳解
預(yù)備知識
Java中的線程對象是Thread,新建線程也只有通過創(chuàng)建Thread對象的實(shí)例來創(chuàng)建。
先說結(jié)論
1 Runnable沒有返回值的FunctionalInterface(jdk 1.8概念)接口,相反Callable是有返回值的FunctionalInterface接口
2 Runnable + Thread 創(chuàng)建一個(gè)無返回結(jié)果的任務(wù)線程
3 Runnable + Callable +Thread 創(chuàng)建一個(gè)有返回結(jié)果的任務(wù)線程
一:Runnable 示例
? 創(chuàng)建一個(gè)無返回結(jié)果的任務(wù)線程,so eazy !!!!
public static void main(String[] args) {
new Thread(new Runnable() {
@Override
public void run() {
System.out.println(Thread.currentThread().getName() + "我是一個(gè)無返回結(jié)果的任務(wù)線程");
}
},"線程一:").start(); //start()開啟任務(wù)
}
二:Callable示例
2.1 JAVA異步編程之Callbacks與Futures模型
我是用Executors線程池的方式來創(chuàng)建的。
2.2 用最原始的方法
public class PrimitiveCallable implements Callable, Runnable {
public static void main(String[] args) {
//實(shí)現(xiàn)
new Thread(new PrimitiveCallable(), "線程二:").start();
}
@Override
public void run() {//Runnable實(shí)現(xiàn)
try {
Object call = this.call();
System.out.println(call);
} catch (Exception exception) {
exception.printStackTrace();
}
}
@Override
public Object call() throws Exception { //Callable 實(shí)現(xiàn)
return "異步任務(wù)返回的結(jié)果!!!";
}
}
2.3 FutureTask 一種jdk的實(shí)現(xiàn)方式
public class FutureTask<V> implements RunnableFuture<V> { //RunnableFuture 實(shí)現(xiàn)了以上2個(gè)接口
........省略.........
public void run() { //重寫run實(shí)現(xiàn)
if (state != NEW ||
!UNSAFE.compareAndSwapObject(this, runnerOffset,
null, Thread.currentThread()))
return;
try {
Callable<V> c = callable; //構(gòu)建對象是傳入的參數(shù)
if (c != null && state == NEW) {
V result;
boolean ran;
try {
result = c.call(); //調(diào)用任務(wù)并返回結(jié)果
ran = true;
} catch (Throwable ex) {
result = null;
ran = false;
setException(ex); //設(shè)置異常時(shí)的結(jié)果
}
if (ran)
set(result); //設(shè)置結(jié)果
}
} finally {
runner = null;
int s = state;
if (s >= INTERRUPTING)
handlePossibleCancellationInterrupt(s);
}
}
........省略.........
}
小結(jié)
1 不要糾結(jié)有幾種創(chuàng)建線程的方法了,就一種即通過Thread,但Thread有9個(gè)構(gòu)造函數(shù)方法
2 9個(gè)構(gòu)造函數(shù)方法
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)到此這篇關(guān)于Java中Runnable與Callable接口的區(qū)別詳解的文章就介紹到這了,更多相關(guān)Java Runnable Callable接口內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
- Java使用多線程批次查詢大量數(shù)據(jù)(Callable返回?cái)?shù)據(jù))方式
- Java通過Callable實(shí)現(xiàn)多線程
- Java多線程中Callable和Future的解讀
- Java中的Callable實(shí)現(xiàn)多線程詳解
- Java使用Callable接口實(shí)現(xiàn)多線程的實(shí)例代碼
- Java多線程實(shí)現(xiàn)之Callable詳解
- Java中Runnable和Callable分別什么時(shí)候使用
- 詳解Java中Callable和Future的區(qū)別
- Java使用Runnable和Callable實(shí)現(xiàn)多線程的區(qū)別詳解
- java面試常問的Runnable和Callable的區(qū)別
- Java并發(fā)教程之Callable和Future接口詳解
- Java中callable的實(shí)現(xiàn)原理
相關(guān)文章
Java實(shí)戰(zhàn)在線選課系統(tǒng)的實(shí)現(xiàn)流程
讀萬卷書不如行萬里路,只學(xué)書上的理論是遠(yuǎn)遠(yuǎn)不夠的,只有在實(shí)戰(zhàn)中才能獲得能力的提升,本篇文章手把手帶你用java+SSM+jsp+mysql+maven實(shí)現(xiàn)一個(gè)在線選課系統(tǒng),大家可以在過程中查缺補(bǔ)漏,提升水平2021-11-11
Spring注解中@Autowired和@Bean的區(qū)別詳解
這篇文章主要詳細(xì)介紹了Spring注解中@Autowired和@Bean二者有什么區(qū)別,文中通過兩個(gè)注解的使用場景介紹了二者的區(qū)別,感興趣的同學(xué)可以參考閱讀2023-06-06
關(guān)于Lambda表達(dá)式的方法引用和構(gòu)造器引用簡的單示例
這篇文章主要介紹了關(guān)于Lambda表達(dá)式的方法引用和構(gòu)造器引用簡的單示例,方法引用與構(gòu)造器引用可以使?Lambda?表達(dá)式的代碼塊更加簡潔<BR>,需要的朋友可以參考下2023-04-04
Java AbstractMethodError原因案例詳解
這篇文章主要介紹了Java AbstractMethodError原因案例詳解,本篇文章通過簡要的案例,講解了該項(xiàng)技術(shù)的了解與使用,以下就是詳細(xì)內(nèi)容,需要的朋友可以參考下2021-08-08
Java實(shí)現(xiàn)發(fā)送短信驗(yàn)證碼功能
這篇文章主要為大家詳細(xì)介紹了Java實(shí)現(xiàn)發(fā)送短信驗(yàn)證碼功能,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2017-11-11

