線(xiàn)程的優(yōu)先級(jí):
線(xiàn)程的優(yōu)先級(jí)越高,占用CPU的能力越強(qiáng);
線(xiàn)程中斷:
調(diào)用線(xiàn)程對(duì)象的interrupt()函數(shù)后,線(xiàn)程并不會(huì)立即中斷满着,而是將線(xiàn)程的中斷標(biāo)識(shí)設(shè)為true,只有遇到阻塞函數(shù)(sleep()贯莺、wait()风喇、join())時(shí),才停止阻塞缕探,拋出異常魂莫,并將中斷標(biāo)識(shí)重置為false;
如何正確中斷線(xiàn)程:
1.使用阻塞函數(shù)捕獲中斷撕蔼,在異常處理中跳出任務(wù)豁鲤,使線(xiàn)程結(jié)束運(yùn)行;
class Runner implements Runnable{
@Override
public void run() {
while (true){
try {
Thread.sleep(2);
} catch (InterruptedException e) {
return;
}
}
}
}
2.使用isInterrupted()判斷線(xiàn)程是否處于中斷狀態(tài)鲸沮,若是中斷狀態(tài)則跳出任務(wù)琳骡,使線(xiàn)程結(jié)束運(yùn)行;
class Runner implements Runnable{
@Override
public void run() {
while (true){
if (Thread.currentThread().isInterrupted()){
return;
}
}
}
}
3.使用中斷標(biāo)識(shí)讼溺;
class Runner implements Runnable{
public volatile boolean on = true;
@Override
public void run() {
while (true){
if (on == false){
return;
}
}
}
}
線(xiàn)程獲取鎖狀態(tài)變化:
1.運(yùn)行中的線(xiàn)程嘗試獲取鎖楣号,若獲取成功則繼續(xù)運(yùn)行,獲取失敗則進(jìn)入同步隊(duì)列怒坯;
2.notify()將等待隊(duì)列的首節(jié)點(diǎn)加入同步隊(duì)列炫狱,notifyAll()將等待隊(duì)列的所有節(jié)點(diǎn)加入同步隊(duì)列;
3.同步隊(duì)列的首節(jié)點(diǎn)獲取同步狀態(tài)成功剔猿,即對(duì)應(yīng)線(xiàn)程獲取鎖成功视译;
4.同步隊(duì)列首節(jié)點(diǎn)的后續(xù)節(jié)點(diǎn)繼續(xù)通過(guò)自旋來(lái)獲取同步狀態(tài);
線(xiàn)程間通信:
多個(gè)線(xiàn)程相互配合完成計(jì)算任務(wù)归敬;
通信方式:
1.使用volatile變量作為信號(hào)量酷含;
2.使用synchronized進(jìn)行鎖同步鄙早;
3.使用wait()和notify()進(jìn)行通信;
//線(xiàn)程1
synchronized(lock){
while(條件不滿(mǎn)足 ){
lock.wait();
}
doSomething();
}
//線(xiàn)程2等待超時(shí)
synchronized(lock){
while(條件不滿(mǎn)足 || remainTime > 0){
lock.wait(remain)
remainTime = futureTime - notTime;
}
}
//線(xiàn)程3
synchronized(lock){
改變條件;
lock.notify();
}
使用wait()和notify()時(shí)線(xiàn)程的狀態(tài)變化
a.RUNNING狀態(tài)的線(xiàn)程獲取鎖失敗則進(jìn)入BOLOCKED狀態(tài)椅亚;
b.RUNNING狀態(tài)的線(xiàn)程調(diào)用wait()方法后進(jìn)入WAITING狀態(tài)限番;
c.WAITING狀態(tài)的線(xiàn)程被別的線(xiàn)程notify()后進(jìn)入BLOCKED狀態(tài);
d.BLOCKED狀態(tài)的線(xiàn)程獲取鎖成功后進(jìn)入RUNNING狀態(tài)呀舔;
4.使用并發(fā)計(jì)數(shù)器CountDownLatch阻塞線(xiàn)程弥虐;
public class CountDownLatchTest {
//計(jì)數(shù)器初始值為2
static CountDownLatch countDownLatch = new CountDownLatch(2);
public static void main(String[] args){
Thread thread1 = new Thread(new Runner(), "thread 1");
Thread thread2 = new Thread(new Runner(), "thread 2");
try {
thread1.start();
thread2.start();
//main線(xiàn)程阻塞,直到計(jì)數(shù)器值為0時(shí)被喚醒
countDownLatch.await();
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("main thread");
return;
}
static class Runner implements Runnable{
@Override
public void run() {
try {
Thread.sleep(2000);
System.out.println(Thread.currentThread().getName());
//計(jì)數(shù)器減一
countDownLatch.countDown();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}
數(shù)據(jù)庫(kù)連接池示例:
1.初始化一定數(shù)量的連接對(duì)象放入隊(duì)列中媚赖;
2.多個(gè)線(xiàn)程并發(fā)的取出霜瘪、歸還conn對(duì)象;
3.通過(guò)加鎖來(lái)解決并發(fā)問(wèn)題省古;
線(xiàn)程池示例:
1.多個(gè)worker線(xiàn)程并發(fā)從job隊(duì)列中獲取job粥庄;
2.job隊(duì)列為空時(shí)worker線(xiàn)程進(jìn)入waiting狀態(tài),往job隊(duì)列中添加job時(shí)notify()等待的線(xiàn)程豺妓,取出job并執(zhí)行;
3.worker線(xiàn)程從非空的job隊(duì)列中取出job布讹,然后執(zhí)行job琳拭;
缺點(diǎn):不能指定job到指定的worker線(xiàn)程執(zhí)行;