1.通過實現Runnable接口創建線程
package com.javaBase.LineDistance; /** * 〈一句話功能簡述〉; * 〈功能詳細描述〉 * * @author jxx * @see [相關類/方法](可選) * @since [產品/模塊版本] (可選) */ public class testRunn implements Runnable { @Override public void run() { System.out.println("123"); } }
package com.javaBase.LineDistance; /** * 〈一句話功能簡述〉; * 〈多線程測試代碼〉 * * @author jxx * @see [相關類/方法](可選) * @since [產品/模塊版本] (可選) */ public class testLine { public static void main(String[] args){ Thread t = new Thread(new testRunn()); t.start(); } }
2.通過實現callable接口創建線程
package com.javaBase.LineDistance; import java.util.concurrent.Callable; /** * 〈一句話功能簡述〉; * 〈功能詳細描述〉 * * @author jxx * @see [相關類/方法](可選) * @since [產品/模塊版本] (可選) */ public class TestCallable implements Callable { @Override public Object call() throws Exception { System.out.println("123"); return "1"; } }
package com.javaBase.LineDistance; import java.util.concurrent.Callable; import java.util.concurrent.FutureTask; /** * 〈一句話功能簡述〉; * 〈多線程測試代碼〉 * * @author jxx * @see [相關類/方法](可選) * @since [產品/模塊版本] (可選) */ public class testLine { public static void main(String[] args){ Callable call = new TestCallable(); FutureTask future = new FutureTask(call); Thread t2 = new Thread(new testRunn()); t2.start(); } }
3.通過集成Thread類創建線程
package com.javaBase.LineDistance; /** * 〈一句話功能簡述〉; * 〈功能詳細描述〉 * * @author jxx * @see [相關類/方法](可選) * @since [產品/模塊版本] (可選) */ public class TestThread extends Thread { @Override public void run() { System.out.println("123"); } public static void main(String[] args){ Thread t = new TestThread(); t.start(); } }
4.使用Executor框架來創建線程池
在Java 5之后,並發編程引入了一堆新的啟動、調度和管理線程的API。Executor框架便是Java 5中引入的,其內部使用了線程池機制,它在java.util.cocurrent 包下,通過該框架來控制線程的啟動、執行和關閉,可以簡化並發編程的操作。因此,在Java 5之后,通過Executor來啟動線程比使用Thread的start方法更好,除了更易管理,效率更好(用線程池實現,節約開銷)外,還有關鍵的一點:有助於避免this逃逸問題——如果我們在構造器中啟動一個線程,因為另一個任務可能會在構造器結束之前開始執行,此時可能會訪問到初始化了一半的對象用Executor在構造器中。
package com.javaBase.LineDistance; import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; /** * 〈一句話功能簡述〉; * 〈功能詳細描述〉 * * @author jxx * @see [相關類/方法](可選) * @since [產品/模塊版本] (可選) */ public class TestExcetor { public static void main(String[] args){ ExecutorService executorService = Executors.newCachedThreadPool(); executorService.execute(new testRunn()); executorService.shutdown(); } }
Executor框架后面再詳解。
5.Runnable和Callable的區別
- Callable規定的方法是call(),Runnable規定的方法是run()
- Callable的任務執行后可返回值,而Runnable的任務是不能返回值得
- call方法可以拋出異常,run方法不可以
- 運行Callable任務可以拿到一個Future對象,表示異步計算的結果。它提供了檢查計算是否完成的方法,以等待計算的完成,並檢索計算的結果。通過Future對象可以了解任務執行情況,可取消任務的執行,還可獲取執行結果。