Java多線程目錄
介紹
從上文中我們知道開啟一個線程需要使用Thread類,自我理解Thread類是一個線程的控制類,它自身并不是一個線程,而線程是里面的run方法,所以我們了解這個類,就是了解這個Thread類是怎么控制線程的創(chuàng)建、運行、中斷、阻塞、休眠的。
方法
1.創(chuàng)建
Thread類提供了很多構(gòu)造方法,這個構(gòu)造方法都是調(diào)用了Thread類中的init方法,來初始化一個線程控制對象,
private void init(ThreadGroup g, Runnable target, String name,
long stackSize, AccessControlContext acc,
boolean inheritThreadLocals) { }
Thread類的構(gòu)造函數(shù)都是調(diào)用的這個,而且參數(shù)概念也是對應的,最后面的兩個參數(shù)暫時不用了解
- ThreadGroup: 線程所屬的線程組,為線程分類,一般不用
- Runnable, 用來實現(xiàn)線程的具體接口實現(xiàn),
- name: 線程的名字,
- stackSize; 線程所需的堆棧大小,這個很少使用,默認是0
2.啟動
start()函數(shù)啟動當前線程。
3.currentThread
這個是Thread類的靜態(tài)方法,這個也比較重要,可以在當前線程里獲取該線程的配置信息。
public class ThreadOne extends Thread{
@Override
public void run() {
super.run();
Thread.currentThread().getName(); //當前線程名字
Thread.currentThread().getId(); //線程id
Thread.currentThread().getPriority(); //線程優(yōu)先級
}
}
如上例子,這些線程信息是我們在線程啟動前配置的,在線程內(nèi)我們可以很好的利用這個currentThread方法來獲取線程信息。
4.中斷方法
中斷方法是一組方法,包含設置中斷標志位,檢測中斷標志位,他是其他線程用來告訴本線程需要中斷了,
public void interrupt();
public boolean isInterrupted();
public static boolean interrupted();
第一個方法:設置中斷標記,這個是其他線程調(diào)用的本線程對象,其他線程告訴本線程中斷。
第二個方法:檢測線程是否中斷,也就是第一個方法是否調(diào)用過,中斷則返回true,否則返回false.
第三個方法:判斷當前線程的中斷狀態(tài)并清除標記位,這個與第二個方法不同之處在于會清楚標記位,也就是這個方法被調(diào)用兩次,第一次中斷狀態(tài)清楚,第二次永遠放回false.
5: sleep(1000)
這個方法讓線程停止運行,休眠一段時間,參數(shù)是毫秒,這里設置的是1s.但這里要注意兩點。
注意1: sleep不會釋放線程鎖,在帶鎖的線程中注意使用。
注意2:sleep會被interrupt中斷,也就是說interrupt會停止你的sleep,而卻sleep會清楚中斷標記位。
6. wait() / wait(1000)
這個方法會使線程等待。
wait()等待的是其他線程的notify通知,線程才會繼續(xù)執(zhí)行,
wait(1000):會等待一段時間后,繼續(xù)執(zhí)行。
注意:wait方法會釋放線程鎖,重新返回或者notify需要重新競爭鎖。
7. join
官方解釋Waits for this thread to die., 等待這個線程結(jié)束,源碼也是這樣利用wait來實現(xiàn)的。
public void test(){
Thread one = new MyThread();
one.start();
one.join();
System.out.println("test");
}
這樣test函數(shù)就會等待one線程執(zhí)行完后再接著執(zhí)行自己,間接的決定了線程的執(zhí)行順序。
8.yield()
使當前線程由運行狀態(tài)轉(zhuǎn)為就緒狀態(tài),讓出CPU時間,讓下一個線程執(zhí)行,下個線程中該線程可能執(zhí)行也可能不執(zhí)行。這個方法不長用。
9.廢棄方法,
Java中已將廢棄stop resume suspend等線程停止等方法。