首頁 > 軟體

Java建立執行緒的方式解析

2022-07-28 14:00:40

繼承Thread,這裡使用匿名內部類

@Slf4j(topic = "c.Test1")
public class Test1 {
    public static void main(String[] args) {
        //建立執行緒物件
        Thread t = new Thread(){
            @Override
            public void run() {
                //要執行的任務
                log.debug("running");
            }
        };
        //設定執行緒的名字
        t.setName("t1");
        //啟動執行緒
        t.start();
        log.debug("running");
    }
}
/*
19:44:31.998 [main] DEBUG c.Test1 - running
19:44:31.998 [t1] DEBUG c.Test1 - running
*/

實現Runnable介面,配合Thread類,同樣用匿名內部類

  • 把執行緒和任務分開
  • Thread表示執行緒
  • Runnable代表可執行的任務
@Slf4j(topic = "c.Test2")
public class Test2 {
    public static void main(String[] args) {
        Runnable runnable = new Runnable() {
            @Override
            public void run() {
                //要執行的任務
                log.debug("running");
            }
        };
        //建立執行緒物件
        Thread t = new Thread(runnable, "t2");
        //啟動執行緒
        t.start();
    }
}
//19:52:27.646 [t2] DEBUG c.Test2 - running

在javajava中,有@FunctionalInterface@FunctionalInterface註解意味著該介面只有一個抽象方法,即可以用lambdalambda表示式的方式簡化

@Slf4j(topic = "c.Test2")
public class Test2 {
    public static void main(String[] args) {
        Runnable runnable = () -> {
            //要執行的任務
            log.debug("running");
        };
        //建立執行緒物件
        Thread t = new Thread(runnable, "t2");
        //啟動執行緒
        t.start();
    }
}

FutureTask配合Thread

因為FutureTask可以介面一個Callable型別的引數,用來處理有返回值的情況

@Slf4j(topic = "c.Test3")
public class Test3 {
    public static void main(String[] args) throws ExecutionException, InterruptedException {
        //建立任務物件
        FutureTask<Integer> task = new FutureTask<>(() -> {
            log.debug("running");
            Thread.sleep(1000);
            return 100;
        });
        /*
        用lambda化簡前
         */
        FutureTask<Integer> task1 = new FutureTask<>(new Callable<Integer>() {
            @Override
            public Integer call() throws Exception {
                log.debug("running");
                Thread.sleep(1000);
                return 100;
            }
        });
        //引數1是任務的物件, 引數2是執行緒的名字
        Thread t = new Thread(task, "t3");
        t.run();
        //主執行緒堵塞,同步等待task執行完畢的結果
        Integer integer = task.get();
        log.debug("結果是:{}", integer);
    }
}

到此這篇關於Java建立執行緒的方式解析的文章就介紹到這了,更多相關Java建立執行緒內容請搜尋it145.com以前的文章或繼續瀏覽下面的相關文章希望大家以後多多支援it145.com!


IT145.com E-mail:sddin#qq.com