線程學(xué)習(xí)
線程的基礎(chǔ)知識
- 線程是什么上沐?
- 線程和進(jìn)程的關(guān)系
- 線程的6個(gè)狀態(tài)
- 線程優(yōu)先級
- 主線程、多線程区匠、后臺線程的概率和特點(diǎn)
- java中怎么創(chuàng)建線程
- 線程的多線程的安全問題
- 線程合并
- 線程棧概念
線程的高級知識
- synchronized的意義和原理
- java中怎解決線程的資源安全問題
1:什么是線程
- 線程,英文名是Thread,是程序運(yùn)行中最小單位,比如在java中的一個(gè)main()方法,當(dāng)我們執(zhí)行main方法的時(shí)候,就是開啟了一個(gè)線程來執(zhí)行這個(gè)main()方法
- 線程也成為輕量級的進(jìn)程,因?yàn)榫€程必須有一個(gè)進(jìn)程來創(chuàng)建尖昏,并且共享進(jìn)程的資源(也就是內(nèi)存),一個(gè)進(jìn)程可以創(chuàng)建多個(gè)線程,這多個(gè)線程共享進(jìn)程的資源.
2:如何創(chuàng)建線程
java 提供了兩種方式來創(chuàng)建線程
- 繼承Thread類,并且重載run()方法
- 實(shí)現(xiàn)runnable接口,并且實(shí)現(xiàn)run()方法
public void howToCreateThread(){
Thread thread1 = new Thread(){
@Override
public void run(){
System.out.println(" 通過覆蓋Thread.run()方法來創(chuàng)建一個(gè)線程");
}
};
<br/>
Runnable thread2 = new Runnable(){
@Override
public void run() {
// TODO Auto-generated method stub
System.out.println(" 通過實(shí)現(xiàn)Runnable接口的.run方法來創(chuàng)建一個(gè)線程");
}
};
}
這里需要注意缺虐,如果是用第一種方法實(shí)現(xiàn)的話,其實(shí)是一個(gè)一個(gè)Runnable任務(wù)礁凡,我們通過 new Thread(new Runnable)把需要執(zhí)行的任務(wù)當(dāng)做參數(shù)傳遞高氮,然后會被設(shè)置到一個(gè)叫做 target的屬性上
3:java線程的狀態(tài)
java線程總共有6個(gè)狀態(tài):new慧妄、runnable、blocked剪芍、waiting腰涧、time_waiting、TERMINATED
new表示是一個(gè)全新的未啟動的線程,還沒有通過start()方法來啟動線程紊浩,只是java線程的外殼
runnable表示在運(yùn)行中的線程,當(dāng)調(diào)用start()方法后窖铡,線程將變成RUNNABLE狀態(tài).
blocked表示被中斷的線程,導(dǎo)致線程被中斷的原因是線程需要的資源被其他線程所占用坊谁,所以要一直等待直到獲取到這個(gè)資源. 比如费彼,當(dāng)前線程要對文件進(jìn)行寫入,如果這個(gè)時(shí)候的文件被其他線程鎖住的話口芍,那么這個(gè)線程就處于blocked狀態(tài).
wait:表示線程在等待中,通過Object.wait()方法可以讓線程處于等待當(dāng)中,然后通過notify()方法可以喚醒這個(gè)線程箍铲,讓這個(gè)線程重新處于 就緒的狀態(tài).
TIME_WAITING: 定時(shí)等待的狀態(tài),等超過了等待的時(shí)間,那么這個(gè)線程就會自動喚醒鬓椭,重新處于就緒的狀態(tài).
TERMINATED: 表示線程處于結(jié)束的狀態(tài)
4:volatile關(guān)鍵字
volatile是java的關(guān)鍵詞颠猴,用來修飾一個(gè)變量,這個(gè)關(guān)鍵詞是java的一種線程安全同步機(jī)制,另外一種同步機(jī)制是synchronized關(guān)鍵詞小染。它和synchronized機(jī)制相幣翘瓮,簡單一些,開銷更少裤翩,所以也稱作輕量級的synchronized资盅。
那么用這個(gè)關(guān)鍵詞修飾了變量之后呢,保證了這個(gè)變量的可見性,保證不同的線程在共享一個(gè)變量的時(shí)候踊赠,可以保證數(shù)據(jù)的一致性,
其實(shí)volatile關(guān)鍵字就是提示VM:對于這個(gè)成員變量不能保存它的私有拷貝呵扛,而應(yīng)直接與共享成員變量交互。