JAVA基础疑难——002多线程

今天写了一个多线程的案例,题目是这样的:

下面是执行的代码部分:

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!细心很重要......

猜你喜欢

转载自blog.csdn.net/qq_31914787/article/details/81738220