public class A {
public static void main(String[] args){
Thread a = new Thread(new AS("one"));
Thread b = new Thread(new AS("two"));
a.start();
b.start();
System.out.println("main ends");
}
static class AS implements Runnable{
String name;
AS(String name) {
this.name = name;
}
@Override
public void run() {
System.out.printf("%s begin: %s\n",name,new Date());
try {
TimeUnit.SECONDS.sleep(4);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.printf("%s end: %s\n",name,new Date());
}
}
}
执行这段代码时,输出如下:
main ends
one begin: Wed Feb 13 09:41:17 CST 2019
two begin: Wed Feb 13 09:41:17 CST 2019
one end: Wed Feb 13 09:41:21 CST 2019
two end: Wed Feb 13 09:41:21 CST 2019
说明主线程先执行;
public class A {
public static void main(String[] args){
Thread a = new Thread(new AS("one"));
Thread b = new Thread(new AS("two"));
a.start();
b.start();
try {
a.join();
b.join();
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("main ends");
}
static class AS implements Runnable{
String name;
AS(String name) {
this.name = name;
}
@Override
public void run() {
System.out.printf("%s begin: %s\n",name,new Date());
try {
TimeUnit.SECONDS.sleep(4);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.printf("%s end: %s\n",name,new Date());
}
}
}
执行这段代码时,输出如下:
one begin: Wed Feb 13 09:42:34 CST 2019
two begin: Wed Feb 13 09:42:34 CST 2019
one end: Wed Feb 13 09:42:38 CST 2019
two end: Wed Feb 13 09:42:38 CST 2019
main ends
结论:
join()方法会阻塞此方法的调用者,等待子线程执行完成再执行调用者线程;案例中main()线程调用join()方法,所以main线程阻塞,等待子线程执行完毕;