首页 > 编程笔记 > Java笔记 阅读:10

Java join()的用法(附带实例)

Java 程序中,假如存在一个线程 A,现在需要插入线程 B,并要求线程 B 先执行完毕,然后继续执行线程 A,此时可以使用 Thread 类中的 join() 方法来完成。这就好比此时读者正在看电视,突然有人上门收水费,读者必须付完水费后才能继续看电视。

当某个线程使用 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 执行完毕后再开始执行,即下面的进度条滚动完毕后上面的进度条才开始滚动。

相关文章