直接上代码
子线程A
package ThreadDemo;
public class MyRunnable1 implements Runnable{
public void run() {
//以循环输出1-10 为例
for (int i = 1; i <= 10; i++) {
System.out.println("当前线程:("+Thread.currentThread().getName()+")***:"+i);
try {
Thread.sleep(200);//加载个延迟,跑起来有格调
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}
子线程B
package ThreadDemo;
public class MyRunnable2 implements Runnable{
public void run() {
//也是以循环输出1-10 为例
for (int i = 1; i <= 10; i++) {
System.out.println("当前线程:("+Thread.currentThread().getName()+")***:"+i);
try {
Thread.sleep(200);//加载个延迟,跑起来有格调
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}
主线程C
package ThreadDemo;
/**
作为主线程,MyRunnable1和MyRunnable2为子线程
测试join方法中到底是执行的“强制”还是“暂停”
*/
public class TextJoin {
public static void main(String[] args) {//主线程main方法
Thread temp1 = new Thread (new MyRunnable1 (),"子线程temp1");//创建实现类的对象,线程参数并命名
Thread temp2 = new Thread (new MyRunnable2 (),"子线程temp2");//创建实现类的对象,线程参数并命名
temp1.start();//启动线程1
temp2.start();//启动线程2
//主线程也是以循环输出1-10 :
for(int i=1; i<=10 ; i++){
System.out.println("当前线程:主线程"+Thread.currentThread().getName()+"运行:"+i);
try {
Thread.sleep(200);//加载延迟,sleep也要处理异常
} catch (InterruptedException e1) {
e1.printStackTrace();
}
//这里是触发“强制”或“暂停”的条件,当i到5时,使用join
if(i==5){
try {
System.out.println("****触发join****");
temp1.join();
//让temp1使用join,测试到底是强制了temp1,还是暂停了main
} catch (InterruptedException e) {
e.printStackTrace();
}finally{
System.out.println("****join结束****");
}
}
}
}
}
从代码中我们看到,join的触发是主线程的循环中i = 5 的时候
而且子线程 MyRunnable1 中的 temp1 调用的.join
而 MyRunnable2 中的temp2 并没有调用
关于join到底是强调“暂停”还是“强制”,我们从字面意义上理解
1.“强制”的执行顺序应该是先执行 MyRunnable1 线程
然后 MyRunnable2 跟 TextJoin 两个线程按照规则交替执行
2.“暂停”的执行顺序应该是先暂停 TextJoin 线程
然后 MyRunnable1 跟 MyRunnable2 两个线程按照规则交替执行
直接运行代码后得到的控制台输出为:
------------------------------------------
当前线程:子线程temp1运行:1
当前线程:子线程temp2运行:1
当前线程:主线程main运行:1
当前线程:子线程temp2运行:2
当前线程:主线程main运行:2
当前线程:子线程temp1运行:2
当前线程:主线程main运行:3
当前线程:子线程temp2运行:3
当前线程:子线程temp1运行:3
当前线程:子线程temp2运行:4
当前线程:主线程main运行:4
当前线程:子线程temp1运行:4
当前线程:子线程temp2运行:5
当前线程:子线程temp1运行:5
当前线程:主线程main运行:5
当前线程:子线程temp1运行:6
触发join
当前线程:子线程temp2运行:6
当前线程:子线程temp2运行:7
当前线程:子线程temp1运行:7
当前线程:子线程temp2运行:8
当前线程:子线程temp1运行:8
当前线程:子线程temp2运行:9
当前线程:子线程temp1运行:9
当前线程:子线程temp2运行:10
当前线程:子线程temp1运行:10
join结束
当前线程:主线程main运行:6
当前线程:主线程main运行:7
当前线程:主线程main运行:8
当前线程:主线程main运行:9
当前线程:主线程main运行:10
-----------------------------------------------