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 执行完毕后再开始执行,即下面的进度条滚动完毕后上面的进度条才开始滚动。
ICP备案:
公安联网备案: