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);
}
}
运行结果如下图所示: