匿名用户
1级
2015-07-20 回答
package com.tarena.fly;
public class asdfsd {
public static void main(String[] args) {
final Thread t1 = new Thread(){
public void run(){
int i = 0;
while(i<10){
System.out.println("t1:"+i++);
try {
Thread.sleep(500);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
};
final Thread t2 = new Thread(){
public void run(){
int i = 0;
try {
t1.join();
} catch (InterruptedException e1) {
e1.printStackTrace();
}
while(i<10){
System.out.println("t2:"+i++);
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
};
Thread t3 = new Thread(){
public void run(){
int i = 0;
try {
t1.join();
t2.join();
} catch (InterruptedException e1) {
e1.printStackTrace();
}
while(i<10){
System.out.println("t3:"+i++);
try {
Thread.sleep(100);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
};
Thread t4 = new Thread(){
public void run(){
int i = 0;
try {
t1.join();
t2.join();
} catch (InterruptedException e1) {
e1.printStackTrace();
}
while(i<10){
System.out.println("t4:"+i++);
try {
Thread.sleep(100);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
};
t1.start();
t2.start();
t3.start();
t4.start();
}
}
t3,t4都格式都一样,我就不排了。
join方法,等待其他线程结束之后再执行,你在T2里加上t1.join,就是等待t1执行完,在执行自己的run方法,然后再其他线程里加上t1.join;t2.join 就OK了;
亲测,给分!
追问:
亲,有点麻烦,麻烦优化行么
追答:
是哪里麻烦了...
你直接粘到java里,把包名类名改一下,运行就知道了。
运行结果:
t1:0
t1:1
t1:2
t1:3
t1:4
t1:5
t1:6
t1:7
t1:8
t1:9
t2:0
t2:1
t2:2
t2:3
t2:4
t2:5
t2:6
t2:7
t2:8
t2:9
t4:0
t3:0
t4:1
t3:1
t4:2
t3:2
t4:3
t3:3
t4:4
t3:4
t4:5
t3:5
t4:6
t3:6
t4:7
t3:7
t4:8
t3:8
t4:9
t3:9
这些线程都是异步运行的,所以一开始都会运行的,没有顺序
但是当,t2,t3,t4运行到t1.join的时候,线程就会产生阻塞,让t1运行,直到t1运行结束。
t2也是一样。
具体的join方法你可以看达内TTS多线程这一块的讲解。
http://pdf7.tarena.com.cn/tts8_source/ttsPage/JAVA/JSD_V04/JAVASE02/DAY04/SUPERDOC/01/index.html