今天写了一个多线程的案例,题目是这样的:
下面是执行的代码部分:
package TestThree.Day06.Test05;
/**
* @author Mr_Z
* @date 2018/8/1517:25
*/
public class Relay implements Runnable{
/**
* 长度1000米
*/
int track=1000;
@Override
public void run() {
while (true){
synchronized (this){
/**
* 跳出语句
*/
if(track<=100){
break;
}
/**
* 获取线程名称
*/
System.out.println(Thread.currentThread().getName()+"拿到了接力棒!");
/**
* 循环判断每10米输出一次!
*/
for(int i=0;i<100;i+=10){
try {
Thread.sleep(500);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println(Thread.currentThread().getName()+"跑了"+(i+10)+"米!");
}
/**
* 停止线程,米数减100
*/
Thread.currentThread().stop();
track-=100;
}
}
}
}
测试类:
package TestThree.Day06.Test05;
/**
* @author Mr_Z
* @date 2018/8/1517:30
*/
public class Test {
public static void main(String[] args) throws InterruptedException {
Relay relay=new Relay();
for(int i=1;i<=10;i++){
new Thread(relay, i + "号选手").start();
}
}
}
猛的看上去,应该执行起来没什么问题,执行后代码如图所示:
结果运行多次后仍然是1线程结束后从10线程递减至2。run方法debag后也没什么问题。当时卡主后做了会就放弃了,今天忽然想起来main方法也有进程,那么for循环与run是同时进行的,而run方法中我给进程设置了Thread.sleep();导致在1线程执行完之前,for循环就跑完了。也就是说,1线程进行完之后,10个线程都已经开启。所以上图运行结果就解释清楚了。知道问题所在,解决起来就简单了。下图为修改后的测试类:
package TestThree.Day06.Test05;
/**
* @author Mr_Z
* @date 2018/8/1517:30
*/
public class Test {
public static void main(String[] args) throws InterruptedException {
Relay relay=new Relay();
for(int i=1;i<=10;i++){
Thread thread = new Thread(relay, i + "号选手");
thread.start();
thread.join();
}
}
}
成功实现1-10接力。OK!细心很重要......