上一篇 <<<安全架構(gòu)設(shè)計(jì)方案
下一篇 >>>線程安全與解決方案
多線程: 在同一個(gè)進(jìn)程開(kāi)啟了多條不同的執(zhí)行路徑踢涌,每條執(zhí)行路徑就是一個(gè)線程,多條不同路徑同時(shí)執(zhí)行背苦。
優(yōu)點(diǎn):
a潘明、提高程序效率 (是否真正實(shí)現(xiàn)多線程是看CPU核數(shù)的,對(duì)于單核的CPU厚宰,程序多線程只不過(guò)是調(diào)度不斷的切換遂填,時(shí)間非常的小而產(chǎn)生的一種錯(cuò)覺(jué)。所以線程設(shè)置優(yōu)先級(jí)撵幽、讓步等基本上都行不通的礁击。)
b逗载、快速響應(yīng)給客戶端撕贞,給用戶更加好的體驗(yàn)
c捏膨、每個(gè)線程之間相互不影響
進(jìn)程和線程區(qū)別
進(jìn)程是所有線程的集合食侮,每一個(gè)線程是進(jìn)程中的一條執(zhí)行路徑,線程只是一條執(zhí)行路徑链快。
單線程和多線程的區(qū)別
單線程:就是使用一條線程從上到下執(zhí)行完代碼眉尸,效率比較低,且響應(yīng)也比較慢霉祸,對(duì)用戶不是很友好丝蹭。
多線程:開(kāi)啟多條不同的線程坪蚁,每個(gè)線程執(zhí)行不同的任務(wù),每個(gè)線程之間相互不影響贱田。
多線程創(chuàng)建方式
- 繼承Thread
- 實(shí)現(xiàn)Runnable 接口
- 使用Callable--可以有返回值
- 線程池--線程的復(fù)用機(jī)制
- @Async注解---存在@Async失效之謎
繼承Thread類好還是實(shí)現(xiàn)Runnable接口好湘换?
Runnable接口好统阿,因?yàn)閷?shí)現(xiàn)了接口還可以繼續(xù)繼承。
繼承Thread類不能再繼承帆离。
多線程的特性
- 原子性
一個(gè)操作或多個(gè)操作要么都執(zhí)行结澄,要么都不執(zhí)行岸夯。
- 可見(jiàn)性
多線程訪問(wèn)同一個(gè)變量時(shí)猜扮,一個(gè)線程修改了值监婶,其他線程應(yīng)該立即看到修改的值,否則容易造成臟讀煮盼。[若兩個(gè)線程在不同的cpu僵控,那么線程1改變了i的值還沒(méi)刷新到主存,線程2又使用了i报破,那么這個(gè)i值肯定還是之前的千绪,線程1對(duì)變量的修改線程沒(méi)看到這就是可見(jiàn)性問(wèn)題。 ]
- 有序性
處理器為了提高程序運(yùn)行效率,可能對(duì)輸入代碼的順序有優(yōu)化帆疟,但不能修改依賴關(guān)系,必須要保證執(zhí)行結(jié)果踪宠。多線程如果順序不弄好妈嘹,單個(gè)方法沒(méi)依賴關(guān)系润脸,但全局有依賴關(guān)系就會(huì)導(dǎo)致很大問(wèn)題。
int a = 10; //語(yǔ)句1
int r = 2; //語(yǔ)句2
a = a + 3; //語(yǔ)句3
r = a*a; //語(yǔ)句4
則因?yàn)橹嘏判虻苟椋€可能執(zhí)行順序?yàn)?2-1-3-4爆价,1-3-2-4
但絕不可能 2-1-4-3媳搪,因?yàn)檫@打破了依賴關(guān)系秦爆。
多線程的應(yīng)用場(chǎng)景
- 分批發(fā)送短信
- 日志記錄
- 比較耗時(shí)的業(yè)務(wù)獨(dú)立處理
- 數(shù)據(jù)庫(kù)連接池
- 迅雷多線程下載等等限。
線程的類型
- 主線程:main線程/進(jìn)程線程
- 守護(hù)線程:gc線程 (主線程掛了活逆,守護(hù)線程也會(huì)被自動(dòng)銷毀.)
- 用戶線程:用戶自己創(chuàng)建的線程(主進(jìn)程關(guān)閉后還會(huì)繼續(xù)執(zhí)行)
public static void main(String[] args) {
Thread t1 = new Thread(new Runnable() {
public void run() {
for(int i=0;i<10;i++){
System.out.println("子線程 i:"+i);
}
}
});
t1.start();
System.out.println("主線程已關(guān)閉");
}
主線程已關(guān)閉
子線程 i:0
子線程 i:1
子線程 i:2
……
使用setDaemon(true)方法可以將用戶線程轉(zhuǎn)為守護(hù)線程蔗候,和主線程一起銷毀
public class DaemonThread {
public static void main(String[] args) {
Thread thread = new Thread(new Runnable() {
public void run() {
while (true) {
try {
Thread.sleep(100);
} catch (Exception e) {
// TODO: handle exception
}
System.out.println("我是子線程...");
}
}
});
thread.setDaemon(true);
thread.start();
for (int i = 0; i < 10; i++) {
try {
Thread.sleep(100);
} catch (Exception e) {
}
System.out.println("我是主線程");
}
System.out.println("主線程執(zhí)行完畢!");
}
}
我是子線程...
我是主線程
主線程執(zhí)行完畢!
多線程的狀態(tài)
如何優(yōu)雅的停止一個(gè)線程
// 設(shè)置可見(jiàn)性
private volatile boolean flag = true;
public void run() {
System.out.println(Thread.currentThread().getName());
// 能保證在線程執(zhí)行完畢后锈遥,才真正的停止一個(gè)線程
while (flag) {
}
}
public void stopThread() {
this.flag = false;
}
其他知識(shí)
a所灸、join方法:join方法對(duì)應(yīng)的線程執(zhí)行完畢后,后面的才可以繼續(xù)執(zhí)行
public static void main(String[] args) {
final Thread t1 = new Thread(new Runnable() {
public void run() {
for (int i = 0; i < 5; i++) {
System.out.println("t1,i:" + i);
}
}
});
final Thread t2 = new Thread(new Runnable() {
public void run() {
try {
t1.join();
} catch (Exception e) {
}
for (int i = 0; i < 5; i++) {
System.out.println("t2,i:" + i);
}
}
});
t1.start();
t2.start();
}
t1,i:0
t1,i:1
t1,i:2
t1,i:3
t1,i:4
t2,i:0
t2,i:1
t2,i:2
t2,i:3
t2,i:4
b钾唬、priority優(yōu)先級(jí)設(shè)置抡秆,范圍為1-10吟策,其中10最高,默認(rèn)值為5着撩。
public static void main(String[] args) {
PrioritytThread prioritytThread = new PrioritytThread();
Thread t1 = new Thread(prioritytThread);
Thread t2 = new Thread(prioritytThread);
t1.start();
// 注意設(shè)置了優(yōu)先級(jí)匾委, 不代表每次都一定會(huì)被執(zhí)行。 只是CPU調(diào)度會(huì)優(yōu)先分配
t1.setPriority(10);
t2.start();
}
c憋沿、Thread.yield()沪猴,暫停當(dāng)前正在執(zhí)行的線程采章,并執(zhí)行其他相同優(yōu)先級(jí)的線程壶辜。目的是讓具有相同優(yōu)先級(jí)的線程之間能夠適當(dāng)?shù)妮啌Q執(zhí)行。
可能沒(méi)有效果抵怎,因?yàn)樽尣降木€程可能被線程調(diào)度程序再次選中岭参。
多線程產(chǎn)生死鎖的原因
同步中嵌套同步,導(dǎo)致鎖無(wú)法釋放和獲取
死鎖診斷
使用jdk自帶的jconsole工具即可
相關(guān)文章鏈接:
<<<線程安全與解決方案
<<<鎖的深入化
<<<鎖的優(yōu)化
<<<Java內(nèi)存模型(JMM)
<<<Volatile解決JMM的可見(jiàn)性問(wèn)題
<<<Volatile的偽共享和重排序
<<<CAS無(wú)鎖模式及ABA問(wèn)題
<<<Synchronized鎖
<<<Lock鎖
<<<AQS同步器
<<<Condition
<<<CountDownLatch同步計(jì)數(shù)器
<<<Semaphore信號(hào)量
<<<CyclicBarrier屏障
<<<線程池
<<<并發(fā)隊(duì)列
<<<Callable與Future模式
<<<Fork/Join框架
<<<Threadlocal
<<<Disruptor框架
<<<如何優(yōu)化多線程總結(jié)