將最近學習的JAVA多線程知識在這裏進行總結和分享,以便以後查看。所有內容僅供參看,有不正確的地方歡迎指出。
一.基本概念
1.常見術語
- 多線程:指的是這個程序(一個進程)運行時產生了不止一個線程
- 並行:多個cpu實例或者多臺機器同時執行一段處理邏輯
- 併發:通過cpu調度算法,不斷切換時間片,執行線程.當一個線程處在運行狀態時,其它線程處於掛起狀態
- 線程安全:在併發情況下,一段邏輯經過多線程使用,線程的調度順序不影響最終結果。
- 同步:使線程共享的資源始終保持一致和準確。
2.線程運行狀態
- yield()方法:當前線程調用此方法,告訴cpu吧運行機會交給線程池中擁有相同優先級的線程。不保證一定能達到讓位的目的,讓步的線程可能再次被調度程度選中。yield()不會導致阻塞。
- join()方法:當前線程裏調用其它線程的join方法,當前線程阻塞,但不釋放對象鎖,直到線程執行完畢或者到達設定的時間。
二.創建線程的四種方式
1.實現Runable接口實現run()方法
public class MyThread extends OtherClass implements Runnable {
public void run() {
System.out.println("MyThread.run()");
}
}
2.繼承Thread類重寫run方法。本質上是實現了 Runnable 接口的一個實例,通過 Thread類的 start() 實例方法。
public class MyThread extends Thread {
public void run() {
System.out.println("MyThread.run()");
}
}
MyThread myThread1 = new MyThread();
MyThread myThread2 = new MyThread();
myThread1.start();
myThread2.start();
3.實現Callable 接口實現call()抽象方法,通過 FutureTask 包裝器創建帶返回值的線程(底層是實現了runnable接口和future接口)
public class Test implements Callable<String> {
public static void main(String[] args) throws ExecutionException, InterruptedException {
Test callableDemo=new Test();
FutureTask<Integer> result = new FutureTask(callableDemo);
new Thread(result).start();
System.out.println(result.get());
}
@Override
public String call() throws Exception {
int a=1;
int b=2;
System.out.println(a+b);
return "執行結果:"+(a+b);
}
}
4.線程池:提供了一個線程隊列,隊列中保存着所有等待狀態的線程。避免了創建與銷燬額外開銷,提高了響應的速度。
public class Test implements Callable<String> {
public static void main(String[] args) throws ExecutionException, InterruptedException {
//newFixedThreadPool創建固定大小的線程池
ExecutorService executorService= Executors.newFixedThreadPool(1);
Test callableDemo=new Test();
Future<String> future=executorService.submit(callableDemo);
System.out.println(future.get());
//關閉線程池
executorService.shutdown();
}
@Override
public String call() throws Exception {
int a=1;
int b=2;
System.out.println(a+b);
return "執行結果:"+(a+b);
}
}