Join方法的使用,简单来说就是把指定的线程加入到当前线程,可以将两个交替执行的线程合并为顺序执行。比如在线程 B 中调用了线程 A 的 Join()方法thread.join,直到线程 A 执行完毕后,才会继续执行线程 B。
代码示例如下所示:
package cn.lspj.ch1.base;
public class UseJoin {
static class A implements Runnable {
private Thread thread;
public A() {
}
public A(Thread thread) {
this.thread = thread;
}
@Override
public void run() {
System.out.println("A 等待执行 ...");
if (thread != null) {
try {
thread.join(); // 线程A中调用了线程B的join方法,需要等待线程B执行完毕后A才能执行
} catch (InterruptedException e) {
e.printStackTrace();
}
}
try {
Thread.sleep(2000);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println(Thread.currentThread().getName() + " ,A 执行完毕 ...");
}
}
static class B implements Runnable {
@Override
public void run() {
System.out.println("B 等待执行 ...");
try {
Thread.sleep(2000);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println(Thread.currentThread().getName() + " ,B 执行完毕 ...");
}
}
public static void main(String[] args) throws InterruptedException {
Thread c = Thread.currentThread();
B b = new B();
Thread threadB = new Thread(b); // 线程B
//A a = new A();
A a = new A(threadB);
Thread threadA = new Thread(a); // 线程A
threadA.start();
threadB.start();
System.out.println("C 等待执行 ...");
threadA.join(); // 当前线程C中调用了线程A的join方法,需要等待线程A执行完毕后C才能执行
Thread.sleep(2000); // 主线程休眠2秒
System.out.println(Thread.currentThread().getName() + " ,C 执行完毕 ...");
}
}
代码执行结果如下:
A 等待执行 ...
C 等待执行 ...
B 等待执行 ...
,B 执行完毕 ...
,A 执行完毕 ...
main ,C 执行完毕 ...
从执行结果不难看出,如果当前线程C中调用了线程A的join方法thread.join,需要等待线程A执行完毕后C才能执行,线程A中调用了线程B的join方法,需要等待线程B执行完毕后A才能执行。
如果main方法代码如下,修改为不适用join方法。
public static void main(String[] args) throws InterruptedException {
Thread c = Thread.currentThread();
B b = new B();
Thread threadB = new Thread(b); // 线程B
A a = new A();
//A a = new A(threadB);
Thread threadA = new Thread(a); // 线程A
threadA.start();
threadB.start();
System.out.println("C 等待执行 ...");
//threadA.join(); // 当前线程C中调用了线程A的join方法,需要等待线程A执行完毕后C才能执行
Thread.sleep(2000); // 主线程休眠2秒
System.out.println(Thread.currentThread().getName() + " ,C 执行完毕 ...");
}
代码执行结果如下:
C 等待执行 ...
A 等待执行 ...
B 等待执行 ...
main ,C 执行完毕 ...
,A 执行完毕 ...
Thread-0 ,B 执行完毕 ...
多次运行输出结果可能还不一样,因此,如果想要两个线程按指定顺序执行,则使用线程的Join即可。
限时特惠:本站持续每日更新海量各大内部创业课程,一年会员仅需要98元,全站资源免费下载
点击查看详情
站长微信:Jiucxh
声明:本站所有文章,如无特殊说明或标注,均为本站原创发布。任何个人或组织,在未征得本站同意时,禁止复制、盗用、采集、发布本站内容到任何网站、书籍等各类媒体平台。如若本站内容侵犯了原著者的合法权益,可联系我们进行处理。