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); } }
运行结果如下图所示:
时间: 2024-11-08 19:00:42