语法:
线程对象.join() //等待该线程终止,原线程才可以继续进行
线程对象.join(long millis)//最久的等待的时间
例子
两个进度条同时进行 加载到100
(1)在A进程执行到20的时候加入B进程,将会执行完B进程后,在执行A进程
if(count==20)
{
threadB.join();//将线程B加入到线程A当中
}
(2)在A执行到20的时候加入B,执行两秒B,然后在一同执行A、B两个进程。
if(count==20)
{
threadB.join(2000);
}
具体代码如下
package MT;
import java.awt.BorderLayout;
import javax.swing.JFrame;
import javax.swing.JProgressBar;
public class JoinTest extends JFrame {
private static final long serivalVersionUID=1L;
private Thread threadA;//定义两个线程
private Thread threadB;
final JProgressBar progressBar =new JProgressBar();//定义两个进度条
final JProgressBar progressBar2 =new JProgressBar();//定义两个进度条
int count=0;
public static void main(String[] args) {
// TODO Auto-generated method stub
init(new JoinTest(),200,100);
}
public JoinTest()
{
super();
//将进度条设置在窗体的最北面
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() {//重写run()方法
while(true) {
progressBar.setValue(++count);//设置进度条当前值
try {
Thread.sleep(100);//休眠1毫秒
/******线程的加入 *****/
if(count==20)
{
//threadB.join();//将线程B加入到线程A当中
threadB.join(2000);//停顿两秒钟
}
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
});
threadA.start(); //启动线程A*/
threadB =new Thread(new Runnable() {
int count=0;
public void run() {//重写run()方法
while(true) {
progressBar2.setValue(++count);//设置进度条当前值
try {
Thread.sleep(100);//休眠1毫秒
/**** 线程的加入*******/
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
if(count==100)
{//当count 变量增长为100
break;//跳出循环
}
}
}
});
threadB.start(); //启动线程B
}
//设置窗体的各种属性
private static void init(JFrame frame,int width,int height) {
// TODO Auto-generated method stub
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setSize(width, height);
frame.setVisible(true);
}
}