Java的多線程同步機制和其他語言開發的是一樣的,在目前線程中,遇到某個事件時,等待另一個線程運作結束或者另一個線程的事件,然後再決定如何處理。
本例來自書上的執行個體,精簡了代碼,調整了部分邏輯,使得看起來更加簡潔明了。已經運作通過。
代碼如下:
package SwingExample;
import java.awt.BorderLayout;
import java.util.Random;
import javax.swing.JFrame;
import javax.swing.JProgressBar;
public class MultiProgress extends JFrame {
/**
*
*/
private static final long serialVersionUID = 1L;
private Thread threadA = null;
private Thread threadB = null;
final JProgressBar progressA = new JProgressBar();
final JProgressBar progressB = new JProgressBar();
int count = 0;
public static void main(String[] args) {
// TODO Auto-generated method stub
init(new MultiProgress(), 640, 480);
}
public MultiProgress() {
super();
getContentPane().add(progressA, BorderLayout.NORTH); // 放在視窗最北邊
getContentPane().add(progressB, BorderLayout.SOUTH); // 放在視窗最南邊
progressA.setStringPainted(true);
progressB.setStringPainted(true);
// 使用内部匿名類的方式初始化Thread
threadA = new Thread(new Runnable() {
int nProgressPercentA = 0;
public void run() {
// 為了達到效果比較理想,要求這個随機數必須大于0,并且能是随機産生的,這樣多線程同步的效果更明顯
Random rand = new Random();
int n = rand.nextInt(100);
while (n == 0)
n = rand.nextInt(100);
while (nProgressPercentA <= 100) {
progressA.setValue(nProgressPercentA++);
try {
Thread.sleep(30);
if (nProgressPercentA >= n) { // 如果目前進度條已經超過了這個随機閥值,停下來等待另一個線程
threadB.join();
}
} catch (Exception e) {
e.printStackTrace();
}
}
}
});
threadA.start();
threadB = new Thread(new Runnable() {
int nProgressPercent = 0;
public void run() {
while (nProgressPercent <= 100) {
progressB.setValue(nProgressPercent++);
try {
Thread.sleep(30);
} catch (Exception e) {
e.printStackTrace();
}
}
}
});
threadB.start();
}
public static void init(JFrame jf, int width, int height) {
jf.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
jf.setSize(width, height);
jf.setVisible(true);
}
}
運作結果如下圖所示:
