多線程運行時有待處理線程?試試看下面介紹的這個批量線程同步方法吧
在一批線程處理程序中有時必須等到所有線程全部運行完後才能進行下一步任務處理 可以采用如下方法解決創建一個鎖對象 該鎖對象提供一個當前線程等待其他線程的方法見代碼
/**
*
* 此類主要用來處理線程的同步屏蔽模型比如一批線程運行必須在最後一個線程運行
* 完後才能進行下一步的操作那麼就可以創建一個鎖對象鎖對象提供一個線程等待其他線程
* 的方法如果當前線程運行時還有未運行的線程則此線程wait否則此線程喚醒其他阻塞的
* 線程進而最終完成線程的運行
* */
public class LockObject {
private int totalThread = ;
private int currentThread = ;
public LockObject(int totalThread) {
thistotalThread = totalThread;
thiscurrentThread = ;
}
public synchronized void waitForOtherThread() {
if (thiscurrentThread < thistotalThread) {
thiscurrentThread++;
try {
thiswait();
} catch (InterruptedException e) {
// TODO Autogenerated catch block
eprintStackTrace();
}
} else {
thiscurrentThread = ;
notifyAll();
}
}
public int getTotalThread() {
return totalThread;
}
public void setTotalThread(int totalThread) {
thistotalThread = totalThread;
}
public int getCurrentThread() {
return currentThread;
}
public void setCurrentThread(int currentThread) {
thiscurrentThread = currentThread;
}
}
批量線程同步機制介紹
此對象提供 二個私有變量totalThread 的初始值為所運行的線程的總數currentThread 為當前正在運行的線程數
線程運行時處理完自己的任務後調用方法waitForOtherThread 等待其他線程結束即當前運行線程數與線程總數的比較
如果運行線程數小於線程總數則當前運行線程數+ 後當前線程進入等待狀態否則喚醒其他等待線程
見測試程序
public class MyThread extends Thread {
public static LockObject lo = new LockObject();
public MyThread(String threadName) {
super(threadName);
}
public void run() {
Systemoutprintln(ThreadcurrentThread()getName() + 開始運行);
lowaitForOtherThread();
Systemoutprintln(ThreadcurrentThread()getName() + 結束運行);
}
public static void main(String[] args) {
for (int i = ; i <= ; i++) {
Thread thread = new MyThread(第 + i + 個線程);
threadsetPriority(NORM_PRIORITY);
threadstart();
}
}
}
以上就介紹了批量線程同步的實現
From:http://tw.wingwit.com/Article/program/Java/gj/201311/27516.html