java併發編程筆記1----創建線程的三種方式詳解

原課程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());
    }
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章