一.new MyThread().start()
繼承Thread類創建線程類
-
定義一個繼承Thread類的子類,并重寫該類的run()方法
-
創建Thread子類的實例,即創建了線程對象
-
調用該線程對象的start()方法啟動線程
二.new Thread(r).start()
實現Runnable接口創建線程類
-
定義Runnable接口的實現類,并重寫該接口的run()方法
-
創建Runnable實現類的實例,并以此實例作為Thread的target對象,即該Thread對象才是真正的線程對象
注意:
在java的體系中,方法一較方法二來說是更好的。因為一個子類只能繼承一個父類,但是卻可以實現多個接口。
三.直觀變形
-
匿名內部類創建 Thread 子類對象。
Thread thread1 = new Thread(){@Overridepublic void run() {System.out.println("使用匿名類創建 Thread 子類對象");} };
-
匿名內部類創 Runnable 子類對象。
Thread thread2 = new Thread(new Runnable() {@Overridepublic void run() {System.out.println("使用匿名類創建 Runnable 子類對象");} });
-
lambda 表達式創建 Runnable 子類對象。
Thread thread3 = new Thread(()-> {System.out.println("使用匿名類創建 Thread 子類對象"); });
四.線程池
參見:
java線程池和多線程的使用詳解_java使用線程池啟動多線程-CSDN博客
可以重點關注其中的“Java線程池的使用”、“線程和線程池的使用規范”以及對應的策略。
五.Future Callable and FutureTask
1.Callable + FutureTask
Callable和Runnable的格式是類似的。
實現Callable的call 方法;
創建一個FutureTask ,用來接收callable的返回;
在主線程中調用 futureTask.get() ,能夠阻塞等待(因為自帶t.join)新線程計算完畢. 并獲取到 FutureTask中的結果
package com.pavin.thread; ? import java.util.concurrent.Callable; import java.util.concurrent.ExecutionException; import java.util.concurrent.FutureTask; ? public class CallableTest { ?public static class MyCallable implements Callable<Integer> { ?@Overridepublic Integer call() throws Exception {int sum = 0;for(int i = 0; i < 100; i++) {sum += i;}return sum;}} ? ?public static void main(String[] args) throws ExecutionException, InterruptedException {MyCallable callable = new MyCallable(); ?FutureTask<Integer> futureTask = new FutureTask<>(callable);Thread t = new Thread(futureTask);t.start(); ?Integer result = futureTask.get();System.out.println(result);} }
輸出結果:4950
2.Callable + Future
package com.pavin.thread; ? import java.util.concurrent.*; ? public class CallableThreadTest { ?public static class MyCallable implements Callable<Integer> { ?@Overridepublic Integer call() throws Exception {int sum = 0;for(int i = 0; i < 100; i++) {sum += i;}return sum;}} ? ?public static void main(String[] args) throws ExecutionException, InterruptedException {ExecutorService service = Executors.newCachedThreadPool();Future<Integer> future = service.submit(new MyCallable()); ?Integer result = future.get();System.out.println(result);service.shutdown();} }
輸出結果:4950