您好,登錄后才能下訂單哦!
java創建線程的方式有幾種?這篇文章運用了實例代碼展示,代碼非常詳細,可供感興趣的小伙伴們參考借鑒,希望對大家有所幫助。
1、繼承Thread類
public class ThreadCreator extends Thread{ public static void main(String[] args) { //第一種方式: ThreadCreator creator = new ThreadCreator(); Thread thread = new Thread(creator,"線程1"); thread.start(); //第二種方式: Thread thread = new ThreadCreator(); thread.start(); //第三種方式: new ThreadCreator().start(); } @Override public void run() { System.out.println(Thread.currentThread().getName() + "run"); } }
2、實現Runnable接口
(免費學習視頻教程分享:java視頻教程)
public class ThreadCreator implements Runnable{ public static void main(String[] args) { ThreadCreator creator = new ThreadCreator(); Thread thread = new Thread(creator,"線程1"); thread.start(); } @Override public void run() { System.out.println(Thread.currentThread().getName() + "run"); } }
3、實現Callable接口
public class ThreadCreator implements Callable<Integer> { public static void main(String[] args) throws ExecutionException, InterruptedException { ThreadCreator creator = new ThreadCreator(); FutureTask futureTask = new FutureTask(creator); Thread thread = new Thread(futureTask,"線程"); thread.start(); System.out.println(futureTask.get()); } @Override public Integer call() { return 1024; } }
4、線程池ExecutorService
public class ThreadCreator{ static ExecutorService service = Executors.newFixedThreadPool(5); public static void main(String[] args) throws ExecutionException, InterruptedException { //execute無返回值 service.execute(new ThreadTask(1,"1")); //submit有返回值 Future<Integer> result = service.submit(new ThreadTaskCall()); System.out.println(result.get()); service.shutdownNow(); } static class ThreadTask implements Runnable{ private int param1; private String param2; public ThreadTask(int param3,String param4){ this.param1 = param3; this.param2 = param4; } @Override public void run() { System.out.println(param1+param2); } } static class ThreadTaskCall implements Callable<Integer>{ @Override public Integer call() throws Exception { return 1024; } } }
線程池中submit和execute的區別:
(1)可接受的任務類型不一樣:execute只能接受Runnable任務,submit還可以接受Callable任務。
(2)返回值:execute無返回值,任務一旦提交,無法在當前線程中監控執行結果。submit有一個Future類型的返回值,用來接收返回值或響應異常。通過get()方法獲取。
submit底層還是調用的execute,只是在此基礎上用future封裝了一層,并將執行過程中產生的異常全部封裝在一個變量中:
public void run() { if (state != NEW || !UNSAFE.compareAndSwapObject(this, runnerOffset, null, Thread.currentThread())) return; try { Callable<V> c = callable; if (c != null && state == NEW) { V result; boolean ran; try { result = c.call(); ran = true; } catch (Throwable ex) { result = null; ran = false; setException(ex); } if (ran) set(result); } } finally { runner = null; int s = state; if (s >= INTERRUPTING) handlePossibleCancellationInterrupt(s); } } protected void setException(Throwable t) { if (UNSAFE.compareAndSwapInt(this, stateOffset, NEW, COMPLETING)) { outcome = t; UNSAFE.putOrderedInt(this, stateOffset, EXCEPTIONAL); // final state finishCompletion(); } }
另外,spring中的schedule注解借鑒使用了submit的處理方式。
5、匿名內部類
public class ThreadCreator { public static void main(String[] args) { //繼承Thread類 new Thread() { @Override public void run() { System.out.println("extends Thread Class!"); } }.start(); //實現Runnable接口 new Thread(new Runnable() { @Override public void run() { System.out.println("implement Runnable!"); } }).start(); //實現Callable接口 new Thread(new FutureTask<Integer>(new Callable() { @Override public Integer call() throws Exception { return 1024; } })).start(); //lambda表達式 new Thread(() -> System.out.println("execute single code")).start(); new Thread(() -> { System.out.println("execute multiple code"); }).start(); } }
lambda線程池:
public class ThreadCreator { static ExecutorService service = Executors.newFixedThreadPool(5); static List list = new ArrayList(); public static void main(String[] args) { service.execute(() -> execute()); //無返回值 Future future = service.submit(() -> execute()); //有返回值 list.add(future); } public static void execute() { //do something } }
以上就是java創建線程的方式匯總,內容較為全面,小編相信有部分知識點可能是我們日常工作可能會見到或用到的。希望你能通過這篇文章學到更多知識。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。