谁先被调用?
示例代码:
package a;
class JoinThread extends Thread{
@Override
public void run() {
for(int i=0;i<10;i++) {
System.out.println(this.currentThread().getName()+" "+i);
}
}
}
public class Join1 {
public static void main(String[] args) {
JoinThread join1=new JoinThread();
JoinThread join2=new JoinThread();
JoinThread join3=new JoinThread();
JoinThread join4=new JoinThread();
JoinThread join5=new JoinThread();
join1.start();
join2.start();
join3.start();
join4.start();
join5.start();
}
}
在这段代码中,一共有6个线程将会被JVM创建。
运行的结果却和我们start的顺序不一样,这是因为这些线程都在Runnable状态,他们都可以被调度,而且先调用谁是随机的。
于是
输出结果:
Thread-1 0
Thread-3 0
Thread-2 0
Thread-0 0
Thread-4 0
Thread-4 1
Thread-0 1
Thread-2 1
Thread-2 2
Thread-2 3
Thread-2 4
Thread-2 5
Thread-2 6
Thread-2 7
Thread-2 8
Thread-2 9
Thread-3 1
Thread-3 2
Thread-3 3
Thread-3 4
Thread-3 5
Thread-3 6
Thread-3 7
Thread-3 8
Thread-3 9
Thread-1 1
Thread-1 2
Thread-1 3
Thread-1 4
Thread-1 5
Thread-1 6
Thread-1 7
Thread-1 8
Thread-1 9
Thread-0 2
Thread-0 3
Thread-0 4
Thread-0 5
Thread-0 6
Thread-0 7
Thread-0 8
Thread-0 9
Thread-4 2
Thread-4 3
Thread-4 4
Thread-4 5
Thread-4 6
Thread-4 7
Thread-4 8
Thread-4 9
可以看到输出的结果非常混乱。
如何保证输出顺序与Start的顺序一致
这里需要用到join()方法;
join()方法的作用:
启动另一个线程并且本线程进入阻塞状态,等到被启动的线程执行完成或者无法继续执行时,本线程再进入就绪状态,等待被调用。
示例代码:
public class Join1 {
public static void main(String[] args) {
JoinThread join1=new JoinThread();
JoinThread join2=new JoinThread();
JoinThread join3=new JoinThread();
JoinThread join4=new JoinThread();
JoinThread join5=new JoinThread();
try {
join1.start();
join1.join();
} catch (InterruptedException e) {
e.printStackTrace();
}
try {
join2.start();
join2.join();
} catch (InterruptedException e) {
e.printStackTrace();
}
try {
join3.start();
join3.join();
} catch (InterruptedException e) {
e.printStackTrace();
}
try {
join4.start();
join4.join();
} catch (InterruptedException e) {
e.printStackTrace();
}
try {
join5.start();
join5.join();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
这样便可以保证在一个线程运行完成之后才去启动另一个线程。
由此便可以保证输出的顺序就是代码里start的顺序。
输出结果:
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
Thread-1 0
Thread-1 1
Thread-1 2
Thread-1 3
Thread-1 4
Thread-1 5
Thread-1 6
Thread-1 7
Thread-1 8
Thread-1 9
Thread-2 0
Thread-2 1
Thread-2 2
Thread-2 3
Thread-2 4
Thread-2 5
Thread-2 6
Thread-2 7
Thread-2 8
Thread-2 9
Thread-3 0
Thread-3 1
Thread-3 2
Thread-3 3
Thread-3 4
Thread-3 5
Thread-3 6
Thread-3 7
Thread-3 8
Thread-3 9
Thread-4 0
Thread-4 1
Thread-4 2
Thread-4 3
Thread-4 4
Thread-4 5
Thread-4 6
Thread-4 7
Thread-4 8
Thread-4 9