join方法的使用
Thread类的方法,不带参数 public final void join()
作用:等待调用该方法的线程结束后才能执行,是一种抢占资源的方式。
没有使用join方法:
package java_thread;
class MyThread2 extends Thread{
public void run(){
System.out.println(getName() + "正在执行!");
}
}
public class JoinDemo {
public static void main(String[] args) {
MyThread2 mt = new MyThread2();
System.out.println("主线程运行结束!");
}
}
执行多次发现都是主线程先执行:
主线程运行结束!
Thread-0正在执行!
使用join方法:
public static void main(String[] args) {
MyThread2 mt = new MyThread2();
mt.start();
try {
mt.join();
} catch (Exception e) {
e.printStackTrace();
}
System.out.println("主线程运行结束!");
}
输出:
Thread-0正在执行!
主线程运行结束!
主线程后执行了。
加入循环语句:
package java_thread;
class MyThread2 extends Thread{
public void run(){
for(int i=0; i <10; i++){
System.out.println(getName() + "正在执行第" + i + "次");
}
}
}
public class JoinDemo {
public static void main(String[] args) {
MyThread2 mt = new MyThread2();
mt.start();
try {
mt.join();
} catch (Exception e) {
e.printStackTrace();
}
for(int j=0; j<15; j++){
System.out.println("主线程正在执行第" + j + "次");
}
System.out.println("主线程运行结束!");
}
}
输出发现也是线程0先执行完10次,主线程再执行:
Thread-0正在执行第0次
Thread-0正在执行第1次
Thread-0正在执行第2次
Thread-0正在执行第3次
Thread-0正在执行第4次
Thread-0正在执行第5次
Thread-0正在执行第6次
Thread-0正在执行第7次
Thread-0正在执行第8次
Thread-0正在执行第9次
主线程正在执行第0次
主线程正在执行第1次
主线程正在执行第2次
主线程正在执行第3次
主线程正在执行第4次
主线程正在执行第5次
主线程正在执行第6次
主线程正在执行第7次
主线程正在执行第8次
主线程正在执行第9次
主线程正在执行第10次
主线程正在执行第11次
主线程正在执行第12次
主线程正在执行第13次
主线程正在执行第14次
主线程运行结束!
若不使用join方法,会发现线程0和主线程随机执行。
还有一种是join带参方法:public final void join(long millis)
作用:等待该线程终止的最长时间为millis毫秒
代码如下:
package java_thread;
class MyThread2 extends Thread{
public void run(){
for(int i=0; i<300; i++){
System.out.println(getName() + "正在执行第" + i + "次");
}
}
}
public class JoinDemo {
public static void main(String[] args) {
MyThread2 mt = new MyThread2();
mt.start();
try {
mt.join(1);
} catch (Exception e) {
e.printStackTrace();
}
for(int j=0; j<15; j++){
System.out.println("主线程正在执行第" + j + "次");
}
System.out.println("主线程运行结束!");
}
}
输出:
Thread-0正在执行第0次
Thread-0正在执行第1次
Thread-0正在执行第2次
Thread-0正在执行第3次
Thread-0正在执行第4次
Thread-0正在执行第5次
Thread-0正在执行第6次
Thread-0正在执行第7次
Thread-0正在执行第8次
主线程正在执行第0次
主线程正在执行第1次
主线程正在执行第2次
主线程正在执行第3次
主线程正在执行第4次
主线程正在执行第5次
主线程正在执行第6次
主线程正在执行第7次
主线程正在执行第8次
主线程正在执行第9次
Thread-0正在执行第9次
主线程正在执行第10次
Thread-0正在执行第10次
主线程正在执行第11次
Thread-0正在执行第11次
Thread-0正在执行第12次
主线程正在执行第12次
Thread-0正在执行第13次
主线程正在执行第13次
Thread-0正在执行第14次
主线程正在执行第14次
Thread-0正在执行第15次
主线程运行结束!
Thread-0正在执行第16次
Thread-0正在执行第17次
Thread-0正在执行第18次
Thread-0正在执行第19次
Thread-0正在执行第20次
Thread-0正在执行第21次
Thread-0正在执行第22次
Thread-0正在执行第23次
Thread-0正在执行第24次
Thread-0正在执行第25次
Thread-0正在执行第26次
Thread-0正在执行第27次
Thread-0正在执行第28次
Thread-0正在执行第29次
Thread-0正在执行第30次
Thread-0正在执行第31次
Thread-0正在执行第32次
Thread-0正在执行第33次
Thread-0正在执行第34次
Thread-0正在执行第35次
Thread-0正在执行第36次
Thread-0正在执行第37次
Thread-0正在执行第38次
Thread-0正在执行第39次
Thread-0正在执行第40次
Thread-0正在执行第41次
Thread-0正在执行第42次
Thread-0正在执行第43次
Thread-0正在执行第44次
Thread-0正在执行第45次
Thread-0正在执行第46次
Thread-0正在执行第47次
Thread-0正在执行第48次
Thread-0正在执行第49次
Thread-0正在执行第50次
Thread-0正在执行第51次
Thread-0正在执行第52次
Thread-0正在执行第53次
Thread-0正在执行第54次
Thread-0正在执行第55次
Thread-0正在执行第56次
Thread-0正在执行第57次
Thread-0正在执行第58次
Thread-0正在执行第59次
Thread-0正在执行第60次
Thread-0正在执行第61次
Thread-0正在执行第62次
Thread-0正在执行第63次
Thread-0正在执行第64次
Thread-0正在执行第65次
Thread-0正在执行第66次
Thread-0正在执行第67次
Thread-0正在执行第68次
Thread-0正在执行第69次
Thread-0正在执行第70次
Thread-0正在执行第71次
Thread-0正在执行第72次
Thread-0正在执行第73次
Thread-0正在执行第74次
Thread-0正在执行第75次
Thread-0正在执行第76次
Thread-0正在执行第77次
Thread-0正在执行第78次
Thread-0正在执行第79次
Thread-0正在执行第80次
Thread-0正在执行第81次
Thread-0正在执行第82次
Thread-0正在执行第83次
Thread-0正在执行第84次
Thread-0正在执行第85次
Thread-0正在执行第86次
Thread-0正在执行第87次
Thread-0正在执行第88次
Thread-0正在执行第89次
Thread-0正在执行第90次
Thread-0正在执行第91次
Thread-0正在执行第92次
Thread-0正在执行第93次
Thread-0正在执行第94次
Thread-0正在执行第95次
Thread-0正在执行第96次
Thread-0正在执行第97次
Thread-0正在执行第98次
Thread-0正在执行第99次