Java創建線程的方式解析
繼承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創建線程內容請搜索WalkonNet以前的文章或繼續瀏覽下面的相關文章希望大傢以後多多支持WalkonNet!
推薦閱讀:
- Java線程的三種創建方式
- Java使用Runnable和Callable實現多線程的區別詳解
- Java線程中的常見方法(start方法和run方法)
- Java創建線程及配合使用Lambda方式
- java面試常問的Runnable和Callable的區別