Java join()的用法(附带实例)
Java 程序中,假如存在一个线程 A,现在需要插入线程 B,并要求线程 B 先执行完毕,然后继续执行线程 A,此时可以使用 Thread 类中的 join() 方法来完成。这就好比此时读者正在看电视,突然有人上门收水费,读者必须付完水费后才能继续看电视。
当某个线程使用 join() 方法加入另一个线程时,另一个线程会等待该线程执行完毕后再继续执行。下面来看一个使用 join() 方法的实例。
【实例】让进度条 A 等待进度条 B。在项目中创建 JoinTest 类,该类继承 JFrame 类。该实例包括两个进度条,进度条的进度由线程来控制,线程通过调用 join() 方法使上面的进度条必须等待下面的进度条完成后才可以继续。
本实例中同时创建了两个线程,这两个线程分别负责进度条的滚动。在线程 A 的 run() 方法中使线程 B 的对象调用 join() 方法,而 join() 方法使当前运行线程暂停,直到调用 join() 方法的线程执行完毕后再执行,所以线程 A 等待线程 B 执行完毕后再开始执行,即下面的进度条滚动完毕后上面的进度条才开始滚动。
当某个线程使用 join() 方法加入另一个线程时,另一个线程会等待该线程执行完毕后再继续执行。下面来看一个使用 join() 方法的实例。
【实例】让进度条 A 等待进度条 B。在项目中创建 JoinTest 类,该类继承 JFrame 类。该实例包括两个进度条,进度条的进度由线程来控制,线程通过调用 join() 方法使上面的进度条必须等待下面的进度条完成后才可以继续。
import java.awt.BorderLayout; import javax.swing.*; public class JoinTest extends JFrame { private Thread threadA; //定义两个线程 private Thread threadB; private JProgressBar progressBar = new JProgressBar(); //定义两个进度条组件 private JProgressBar progressBar2 = new JProgressBar(); public static void main(String[] args) { JoinTest test = new JoinTest(); test.setVisible(true); } public JoinTest() { setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); setBounds(200, 200, 200, 100); //将进度条设置在窗体最北面 getContentPane().add(progressBar, BorderLayout.NORTH); //将进度条设置在窗体最南面 getContentPane().add(progressBar2, BorderLayout.SOUTH); //设置进度条显示数字字符 progressBar.setStringPainted(true); progressBar2.setStringPainted(true); //使用匿名内部类形式初始化 Thread 实例 threadA = new Thread(new Runnable() { int count = 0; public void run() { while (true) { progressBar.setValue(++count); //设置进度条的当前值 try { Thread.sleep(100); //使线程 A 休眠 100 毫秒 threadB.join(); //使线程 B 调用 join()方法 } catch (InterruptedException e) { e.printStackTrace(); } } } }); threadA.start(); //启动线程 A threadB = new Thread(new Runnable() { int count = 0; public void run() { while (true) { progressBar2.setValue(++count); //设置进度条的当前值 try { Thread.sleep(100); //使线程 B 休眠 100 毫秒 } catch (InterruptedException e) { e.printStackTrace(); } if (count == 100) { break; //当 count 变量增长为 100 时 } } threadA.start(); //启动线程 B } }); } }运行结果如下图所示:

图 1 使用 join() 方法控制进度条的滚动
本实例中同时创建了两个线程,这两个线程分别负责进度条的滚动。在线程 A 的 run() 方法中使线程 B 的对象调用 join() 方法,而 join() 方法使当前运行线程暂停,直到调用 join() 方法的线程执行完毕后再执行,所以线程 A 等待线程 B 执行完毕后再开始执行,即下面的进度条滚动完毕后上面的进度条才开始滚动。