多個線程順序執行的幾種方法?
這個要分段來實現, 第一步是讓線程同步,第二部是讓線程有順序。
同步:我們可以用synchronized來解決。
java線程同步原理: java會為每個object對象分配一個monitor,當某個對象的同步方法(synchronized methods )被多個線程調用時,該對象的monitor將負責處理這些訪問的并發獨占要求。
當一個線程調用一個對象的同步方法時,JVM會檢查該對象的monitor。如果monitor沒有被占用,那么這個線程就得到了monitor的占有權,可以繼續執行該對象的同步方法;如果monitor被其他線程所占用,那么該線程將被掛起,直到monitor被釋放。
當線程退出同步方法調用時,該線程會釋放monitor,這將允許其他等待的線程獲得monitor以使對同步方法的調用執行下去。就像下面這樣:
public void test() {
synchronized (this) {
//做一些事
//這里只會有一個線程來調用該方法,因為只有一個this對象作為資源分配給該線程
}
}
順序:我們可以用List來解決,因為它是有序的。我們只需要將要執行的線程放入到List中
上代碼:
/**
* 讓多個線程同步順序執行的線程管理器
* @author bianrx
* @date 2012.1.18
* SynchronizedRunMultiThread
*/
public class SyncManager {
/**
* 待執行的線程集合,注意這里必須是Runnable接口類型,下面會解釋
*/
private List<Runnable> runnableList;
public SyncManager(){}
public SyncManager(List<Runnable> runnableList) {
this.runnableList
= runnableList;}
public void setRunnable(List<Runnable> runnableList) {
this.runnableList
= runnableList;}
public void run() {
//遍歷代執行的線程集合
for(Runnable runnable: runnableList) {
runThread(runnable);
}
}
/**
* 按順序同步執行多個線程
* @author bianrx
* @date 2012.1.18
* @param runnable
*/
private void runThread(Runnable runnable) {
synchronized (this) {
runnable.run();//這里需要注意的是:必須調用run方法,因為如果你調用了start方法,線程只會向JVM請求資源,但是未必就執行其中的run。
//這個方法是同步的,所以當前只有一個線程占用了this對象。
}
}
}