為了提升程序性能错维,我們可以將任務(wù)分成互相獨(dú)立的子任務(wù)并使用多線程來處理。這里提供了詳細(xì)的講解匿乃,本文是作者的讀書筆記。
線程的生命周期:New, Waiting, Running, Dead等股缸。
線程具有優(yōu)先級(jí),從MIN_PRIORITY(1)到MAX_PRIORITY(10)吱雏,線程的默認(rèn)優(yōu)先級(jí)為NORM_PRIORITY(5),優(yōu)先級(jí)越高敦姻,越容易被執(zhí)行。
有兩種方式來創(chuàng)建thread歧杏,by implementing Runnable Interface, by extending Thread class镰惦。
Implementing Runnable Interface
1. 創(chuàng)建實(shí)現(xiàn)Runnable接口的類并實(shí)現(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()進(jìn)行控制茵瘾,如下所示礼华。synchronized用于確保對(duì)象或方法在同一時(shí)間只能被一個(gè)線程訪問。
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)建的變量在每個(gè)thread中保存一個(gè)備份拗秘,只能被本線程讀寫圣絮,因此,不會(huì)受其他線程影響聘殖。下面的兩個(gè)counter晨雳,counter會(huì)受不同線程的影響行瑞,而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是因?yàn)橛捎诙鄠€(gè)線程需要相同的locks血久,但是以不同順利獲得這些locks造成的突照。
lock和synchronized的區(qū)別:1.synchronized不能保證順序,而lock可以氧吐;2. synchronized block沒有timeout讹蘑,而lock可以提供timeout功能;3.synchronized只能作用于同一個(gè)函數(shù)筑舅,而lock的lock()和unlock()函數(shù)可以用于不同的函數(shù)座慰。