1.繼承Thread類 public class ThreadCreator extends Thread{ public static void main(String[] args) { //第一種方式: ThreadCreator creator = new ThreadCreator(); ...
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介面
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的區別:
① 可接受的任務類型不一樣:execute只能接受Runnable任務,submit還可以接受Callable任務。
② 返回值: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 } }