原課程B站地址:全面深入學習java併發編程,中級程序員進階必會
java中創建線程有三種方式
第一種
使用new Thread()直接創建
/**
* 第一種創建線程方法
* 最基礎的創建線程方法
* */
@Slf4j(topic = "c.Test1")
public class Test1 {
public static void main(String[] args) {
//t1是線程的名字
Thread t = new Thread("t1"){
@Override
public void run() {
log.debug("running");
}
};
t.start();
log.debug("running");
}
}
第二種
使用Runnable接口,將任務代碼和線程分開,解耦,推薦使用
/**
* 第二種創建線程方法
* 使用Runnable創建線程,使得線程和任務代碼分開,降低耦合
* 推薦使用
* 容易與線程池等高級API配合
* 讓任務類脫離Thread繼承關係
* */
@Slf4j(topic = "c.Test2")
public class Test2 {
public static void main(String[] args) {
/**
* 查看源碼可以發現,Runnable接口被 @FunctionalInterface 註釋修飾
* 當接口內只有一個抽象方法的時候,可以使用lambda表達式精簡代碼
* */
Runnable r = () ->{
log.debug("running");
log.debug("hello world");
};
//不使用lambda表達式
// Runnable r = new Runnable() {
// public void run() {
// log.debug("running");
// }
// };
Thread t = new Thread(r,"t2");
t.start();
}
}
第三種
使用FutureTask配合Thread
查看源碼可以得知,FutureTask類實現RunnableFuture接口,而RunnableFuture接口繼承自Runnable和 Future,不僅能作爲參數傳入Thread,同時FutureTask能夠接受Callable類型的參數,所以又可以返回結果,所以它可以被看作Runnable的升級版。
/**
* 第三種創建線程的方法
* FutureTask配合Thread
* Future能夠接受Callable類型的參數,用來處理有返回結果的情況
*
* */
@Slf4j(topic = "c.Test3")
public class Test3 {
public static void main(String[] args) throws ExecutionException, InterruptedException {
//任務對象
FutureTask<Integer> task = new FutureTask<>(new Callable<Integer>() {
@Override
public Integer call() throws Exception {
log.debug("running");
Thread.sleep(1000);
return 100;
}
});
Thread t = new Thread(task,"t1");
t.start();
//等待線程返回結果
log.debug("{}",task.get());
}
}