為了提升程序性能,我們可以將任務(wù)分成互相獨立的子任務(wù)并使用多線程來處理。這里提供了詳細的講解,本文是作者的讀書筆記。
線程的生命周期:New, Waiting, Running, Dead等。
線程具有優(yōu)先級,從MIN_PRIORITY(1)到MAX_PRIORITY(10),線程的默認優(yōu)先級為NORM_PRIORITY(5),優(yōu)先級越高,越容易被執(zhí)行。
有兩種方式來創(chuàng)建thread,by implementing Runnable Interface, by extending Thread class。
Implementing Runnable Interface
1. 創(chuàng)建實現(xiàn)Runnable接口的類并實現(xiàn)其run()函數(shù);
2. 利用Thread類的Thread(Runnable threadObj, String threadName)來創(chuàng)建thread;
3. 調(diào)用thread的start()方法來執(zhí)行線程。
Extending Thread Class
1. 通過繼承Thread class來生成thread并override起run()函數(shù);
2. 調(diào)用Thread的start()方法來執(zhí)行線程。
Inter-thread communication
我們可以在thread之間使用wait(),notify()進行控制,如下所示。synchronized用于確保對象或方法在同一時間只能被一個線程訪問。
public boolean flag = false;
public synchronized void Question(String? msg){
? ? if(flag){
? ? ? ? ? try{
? ? ? ? ? ? ? ? wait();
? ? ? ? ? }catch(InterruptedException e){
? ? ? ? ? ? ? ? e.printStackTrace();
? ? ? ? ?}
? ? ?}
? ? System.out.println(msg);
? ?flag = true;
? ?notify();
}
ThreadLocal class
Threadlocal class 創(chuàng)建的變量在每個thread中保存一個備份,只能被本線程讀寫,因此,不會受其他線程影響。下面的兩個counter,counter會受不同線程的影響,而threadLocalCounter只受本線程的影響,不受其他線程影響。
class RunnableDemo implements Runnable {??
int counter;? ThreadLocal threadLocalCounter = new ThreadLocal();
public void run() {
counter++;
if(threadLocalCounter.get() != null){
threadLocalCounter.set(threadLocalCounter.get().intValue() + 1);
}else{
threadLocalCounter.set(0);
}
System.out.println("Counter: " + counter);
System.out.println("threadLocalCounter: " + threadLocalCounter.get());
}
}
Deadlock是因為由于多個線程需要相同的locks,但是以不同順利獲得這些locks造成的。
lock和synchronized的區(qū)別:1.synchronized不能保證順序,而lock可以;2. synchronized block沒有timeout,而lock可以提供timeout功能;3.synchronized只能作用于同一個函數(shù),而lock的lock()和unlock()函數(shù)可以用于不同的函數(shù)。