多线程相关知识
多線程相關知識
?
兩個線程進行通信:通過等待(wait)喚醒(notify)機制
?
?
?
?
三個或三個以上線程進行通信:通過notifyAll()方法
/* * 1. 在同步代碼塊中,用哪個對象鎖,就用哪個對象調用wait方法 * 2. 為什么wait和notify方法定義在Object類中? * 因為鎖對象可以是任意對象,而Object類是所有類的基類,所以wait和notify方法定義在Object類中 * 3. sleep和wait的區別: * 1)sleep方法必須傳入時間參數,時間到了自動醒來 * 2)waot方法可傳入參數也可不傳,傳入參數是指時間到了繼續等待,不傳入參數就直接等待 * 3)sleep方法在同步函數或者同步代碼塊中不釋放鎖,睡著了也要抱著鎖睡 * 4)wait方法在同步函數或者同步代碼塊中不釋放鎖 * * 4. notify和notifyAll的區別: * notify:隨機喚醒單個等待線程 * notifyAll:喚醒所有等待的線程 * */?
?
通過ReentrantLock互斥鎖來實現多個線程通信:
?
?
線程的生命周期:
?
?
?
線程池:
1. 程序啟動一個新線程的成本是比較高的,因為它涉及到要與操作系統進行交互,而使用線程池能夠提高性能
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;public class Main {public static void main(String[] args) {ExecutorService es = Executors.newFixedThreadPool(2);es.submit(new myRunnable());es.submit(new myRunnable());es.shutdown();}
}
class myRunnable implements Runnable{@Overridepublic void run() {for(int i = 0; i < 100; i++){System.out.println(Thread.currentThread().getName() + "..."+i);}}
}
利用callable來創建多線程:
import java.util.concurrent.*;public class CallableTest {public static void main(String[] args) throws ExecutionException, InterruptedException {ExecutorService es = Executors.newFixedThreadPool(2);Future<Integer> f1 = es.submit(new myCallable(100));Future<Integer> f2 = es.submit(new myCallable(500));System.out.println(f1.get());System.out.println(f2.get());es.shutdown();} } class myCallable implements Callable<Integer>{private int num;public myCallable(int num){this.num = num;}@Overridepublic Integer call() throws Exception {int sum = 0;for(int i = 0; i <= num; i++){sum+=i;}return sum;} }?
?
總結
- 上一篇: JVM004_字节码指令简介
- 下一篇: Java常用设计模式————原型模式(一