我创建了一个非常简单的线程逻辑来查看竞争条件,但是我看到了一个意外的行为,这让我觉得我缺少一些关于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)应该只做了那个特定的线程睡觉不是主要的。
不确定我在这里缺少什么。
答案 0 :(得分:2)
Thread.sleep(long)
javadoc说(强调添加)
使 当前执行线程暂停
该方法为static
,因此您无法在特定的Thread
实例上调用它。每个电话,
threads[i].sleep(1000);
实际正在做
Thread.sleep(1000);
这是你不应该通过实例调用static
方法的一个原因(你的编译器应该给你一个警告)。
答案 1 :(得分:1)
你不能让另一个线程睡觉。如果一个线程想要睡觉,它必须让自己睡觉。
您编写每个线程的代码。所以永远不应该有任何理由试图进入&#34;另一个线程让它做点什么。如果一个线程应该睡眠,它应该被编码为睡眠。如果一个主题没有做你想做的事情,那就修好它。