thread類是被繼承的,執(zhí)行的時候調(diào)用的是繼承它的子類,但java一般實現(xiàn)多線程不是繼承thread類,而是實現(xiàn)runnable接口,因為java不能多重繼承,所以繼承thread類后就不能繼承別的類了。
10年積累的做網(wǎng)站、成都網(wǎng)站制作經(jīng)驗,可以快速應(yīng)對客戶對網(wǎng)站的新想法和需求。提供各種問題對應(yīng)的解決方案。讓選擇我們的客戶得到更好、更有力的網(wǎng)絡(luò)服務(wù)。我雖然不認(rèn)識你,你也不認(rèn)識我。但先網(wǎng)站設(shè)計后付款的網(wǎng)站建設(shè)流程,更有橋西免費網(wǎng)站建設(shè)讓你可以放心的選擇與我們合作。
只要實現(xiàn)runnable接口(或繼承了thread類)就可以實現(xiàn)多線程。
比如說有a
b
c
d
e五個類都實現(xiàn)runnable接口(或繼承了thread類)
你先進(jìn)了main方法,就創(chuàng)建了一個線程,這個線程是main方法的
你調(diào)用a的run()方法,就又創(chuàng)建一個線程,這個線程是a方法的。
如果還不懂得話建議你去看看什么叫繼承和接口,基礎(chǔ)差的話理解起來有點困難
我可是辛辛苦苦打字半天了~~~
這個。。你不必糾結(jié)。。
深入說的話,其實。。很深。。
首先說 線程優(yōu)先級,并不能保證優(yōu)先級高的先運(yùn)行,也不保證優(yōu)先級高的更多的分配CPU時間,只是對系統(tǒng)的建議而已,到底運(yùn)行哪個,是操作系統(tǒng)決定的,都不是java說了算的。
另外java只能保證在線程內(nèi)部看起來是順序執(zhí)行你的代碼的,并不能保證從其他線程看來這個是按照你編碼順序執(zhí)行的。。
這個要分段來實現(xiàn), 第一步是讓線程同步,第二部是讓線程有順序。
同步:我們可以用synchronized來解決。
Java線程同步原理: java會為每個object對象分配一個monitor,當(dāng)某個對象的同步方法(synchronized methods )被多個線程調(diào)用時,該對象的monitor將負(fù)責(zé)處理這些訪問的并發(fā)獨占要求。
當(dāng)一個線程調(diào)用一個對象的同步方法時,JVM會檢查該對象的monitor。如果monitor沒有被占用,那么這個線程就得到了monitor的占有權(quán),可以繼續(xù)執(zhí)行該對象的同步方法;如果monitor被其他線程所占用,那么該線程將被掛起,直到monitor被釋放。
當(dāng)線程退出同步方法調(diào)用時,該線程會釋放monitor,這將允許其他等待的線程獲得monitor以使對同步方法的調(diào)用執(zhí)行下去。就像下面這樣:
public void test() {
synchronized (this) {
//做一些事
//這里只會有一個線程來調(diào)用該方法,因為只有一個this對象作為資源分配給該線程
}
}
順序:我們可以用List來解決,因為它是有序的。我們只需要將要執(zhí)行的線程放入到List中
上代碼:
/**
* 讓多個線程同步順序執(zhí)行的線程管理器
* @author bianrx
* @date 2012.1.18
* SynchronizedRunMultiThread
*/
public class SyncManager {
/**
* 待執(zhí)行的線程集合,注意這里必須是Runnable接口類型,下面會解釋
*/
private ListRunnable runnableList;
public SyncManager(){}
public SyncManager(ListRunnable runnableList) {
this.runnableList = runnableList;
}
public void setRunnable(ListRunnable runnableList) {
this.runnableList = runnableList;
}
public void run() {
//遍歷代執(zhí)行的線程集合
for(Runnable runnable: runnableList) {
runThread(runnable);
}
}
/**
* 按順序同步執(zhí)行多個線程
* @author bianrx
* @date 2012.1.18
* @param runnable
*/
private void runThread(Runnable runnable) {
synchronized (this) {
runnable.run();//這里需要注意的是:必須調(diào)用run方法,因為如果你調(diào)用了start方法,線程只會向JVM請求資源,但是未必就執(zhí)行其中的run。
//這個方法是同步的,所以當(dāng)前只有一個線程占用了this對象。
}
}
}
-main-t1 mian線程執(zhí)行到T1時T1線程開始執(zhí)行,mian接著往下執(zhí)行,屬于并行
-main-t2 mian線程執(zhí)行到T2時T2線程開始執(zhí)行,mian接著往下執(zhí)行,屬于并行
-t1 -t2 T1和T2屬于并行線程
-mian mian等待子線程執(zhí)行完后結(jié)束。
線程執(zhí)行貌似沒有順序,根據(jù)CPU的資源使用情況而定,不過你可以:
用線程之間通信來解決上述的業(yè)務(wù),如使用共享式變量的方式控制其業(yè)務(wù)順序??!