子线程上的Sleep方法线程也导致主线程处于休眠状态

时间:2017-06-24 00:23:02

标签: java multithreading

我创建了一个非常简单的线程逻辑来查看竞争条件,但是我看到了一个意外的行为,这让我觉得我缺少一些关于Java中多线程的非常重要的概念。

这是我的主题类

public class MyThreadDoinNothing implements Runnable {
    private int count = 0;

    @Override public void run() {
        count++;
        System.out.println(count);
    }
}

这是MAIN

public class MAIN {
    public static void main(String[] args) throws InterruptedException {
        Thread[] threads=new Thread[100];
        Runnable object=new MyThreadDoinNothing();
        for (int i=0;i<100;i++) {
            threads[i] = new Thread(object);
            threads[i].start();
            threads[i].sleep(1000);
        }
    }
}

我希望MAIN线程运行~1s并打印100个带竞争条件的数字。但是它正在发生的事情是它采取了100秒的整个程序。我虽然线程[i] .sleep(1000)应该只做了那个特定的线程睡觉不是主要的。

不确定我在这里缺少什么。

2 个答案:

答案 0 :(得分:2)

Thread.sleep(long) javadoc说(强调添加)

  

使 当前执行线程暂停

该方法为static,因此您无法在特定的Thread实例上调用它。每个电话,

threads[i].sleep(1000);

实际正在做

Thread.sleep(1000);

这是你不应该通过实例调用static方法的一个原因(你的编译器应该给你一个警告)。

答案 1 :(得分:1)

你不能让另一个线程睡觉。如果一个线程想要睡觉,它必须让自己睡觉。

您编写每个线程的代码。所以永远不应该有任何理由试图进入&#34;另一个线程让它做点什么。如果一个线程应该睡眠,它应该被编码为睡眠。如果一个主题没有做你想做的事情,那就修好它。