new Thread(new Runnable() {
public void run() {
}
});
相信大家对这段代码很熟悉,在进行异步操作的时候,会经常用到它。
假如有两个线程同时执行的话,分别处理一段输出的逻辑,代码如下:
public static void main(String[] args) {
final Thread A = new Thread(new Runnable() {
public void run() {
printTest("A");
}
});
Thread B = new Thread(new Runnable() {
public void run() {
printTest("B");
}
});
A.start();
B.start();
}
public static void printTest(String threadName){
int count = 0;
while(count < 5){
count++;
System.out.println(threadName + ":" + count);
}
}
运行结果:
第一次运行
B==1
A==1
B==2
A==2
B==3
A==3
B==4
B==5
A==4
A==5
第二次运行
A==1
B==1
A==2
B==2
A==3
B==3
B==4
B==5
A==4
A==5
发现不是每次运行的结果顺序都不一样,这不是我们当时设计的初衷,我们想的是先执行完A再执行B的,但是这个结果不是我们想要的。这里主要是因为线程间是默认是没法保证哪个先执行的,所以两次的结果才出现不一致的情况。那么,有没有办法让A先执行完再执行B呢?答案当然是有了,这时候join就起到作用了,咱们在B线程里代码加上这么一句A.join()即可,修改后的代码如下:
public static void main(String[] args) {
final Thread A = new Thread(new Runnable() {
public void run() {
printTest("A");
}
});
Thread B = new Thread(new Runnable() {
public void run() {
try {
A.join();//此处加入join,表示先执行完A线程后再执行此后面的语句
printTest("B");
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
});
A.start();
B.start();
}
public static void printTest(String threadName){
int count = 0;
while(count < 5){
count++;
System.out.println(threadName + ":" + count);
}
}
咱们再看下运行的结果如何,是否达到我们的目的:
第一次运行
A==1
A==2
A==3
A==4
A==5
B==1
B==2
B==3
B==4
B==5
第二次运行
A==1
A==2
A==3
A==4
A==5
B==1
B==2
B==3
B==4
B==5
哈哈,到这里知道join的用处了吧。