Java多线程混乱的代码片段

Java多线程混乱的代码片段,java,multithreading,Java,Multithreading,如果在不同时间随机执行,下面的代码应该如何执行 public class Unstoppable extends Thread { private int counter; @Override public void run() { synchronized(this) { for(int i = 0; i < 10; i++) counter++; this.not

如果在不同时间随机执行,下面的代码应该如何执行

public class Unstoppable extends Thread {
    private int counter;

    @Override
    public void run() {
        synchronized(this) {
            for(int i = 0; i < 10; i++)
                counter++;

            this.notifyAll();
        }
    }

    public static void main(String[] args) throws InterruptedException {
        Unstoppable unStoppable = new Unstoppable();

        System.out.println("I am about to start");
        unStoppable.start();
        synchronized(unStoppable) {
            System.out.println("I was just told to wait");
            unStoppable.wait();
        }

        System.out.println(unStoppable.counter);
    }
}
公共类不可阻挡扩展线程{
专用int计数器;
@凌驾
公开募捐{
已同步(此){
对于(int i=0;i<10;i++)
计数器++;
this.notifyAll();
}
}
公共静态void main(字符串[]args)引发InterruptedException{
不可阻挡不可阻挡=新的不可阻挡();
System.out.println(“我即将开始”);
不可阻挡。开始();
同步(不可阻挡){
System.out.println(“我刚被告知要等”);
不可阻挡的;
}
System.out.println(不可阻挡计数器);
}
}

第一次看到它时,它似乎会无限地挂起,但每次我执行它时,它都会令人惊讶地安静下来……它完成了执行。

您是否忽略了异常。。。。守则:

// synchronized(unstoppable) {
    System.out.println("I was just told to wait forever");
    unstoppable.wait();
// }
应抛出一个
非法监视器状态异常
,并立即退出


编辑


因此,您更改了代码,现在它按照您期望的方式工作(它将永远等待),那么问题出在哪里?(我刚刚测试过)。

如果您有两个或更多线程,那么同步是有意义的。在您的情况下,只有一个线程

 public static void main(String[] args) throws InterruptedException {
    Unstoppable unStoppable = new Unstoppable();
    Unstoppable unStoppable2 = new Unstoppable();
    Unstoppable unStoppable3 = new Unstoppable();
    System.out.println("I am bout to start");
    unStoppable.start();
    unStoppable2.start();
    unStoppable3.start();
    synchronized (unStoppable) {
        System.out.println("I was just told to wait");
        unStoppable.wait();
    }

    System.out.println(unStoppable.counter);
}

}
在随机时间执行此操作,它可能会等待或尝试增加线程数。顺便说一下,
wait
应该这样实现

 synchronized (obj) {
     while (<condition does not hold>)
         obj.wait();
     ... // Perform action appropriate to condition
  }
synchronized(obj){
而()
obj.wait();
…//执行适合条件的操作
}
在第一次看到它时,它似乎会无限地挂起,但每次我执行它时,它都会异常安静……它完成了执行

它之所以完成,是因为当
线程
完成时,会有一个对
线程.notify()的幕后调用
。这就是
thread.join()
的实现方式

也就是说,依赖代码以这种方式工作不是一个好主意——或者至少应该将其标记为黑客。您应该改用
thread.join()

unStoppable.join();
<>最后,你应该考虑让你的代码>不可阻挡的< /Cord>类实现<代码> Runnaby<代码>,而不是扩展线程。这是一个更好的模式:

public class Unstoppable implements Runnable {
...

Thread unStoppableThread = new Thread(new Unstoppable());
...
unStoppableThread.join();

您在循环中的某个条件下等待。还有
unstopped unstopped=新的unstopped()没有遵循正确的类命名约定。同时,在一个并行的世界中…用所有小写字母调用类“不可阻挡”是错误的。用与类完全相同的名称和大小写调用实例是双重错误的。永远等着我。真是浪费时间!只有一个线程…增加线程数,它将等待。你是对的,我粘贴了错误的代码段…更正了…现在告诉我?顺便说一句@rolfl我知道将等待放入同步块是正常的,但是什么是验证此正常的经验法则?没有经验法则,这是语言要求(不是建议)。。。但是…我的问题是为什么?即使是语言要求,为什么呢?请参阅教程:他的问题已经更改了很多次,因此您的答案虽然对于此版本的代码是正确的,但对于第一个版本来说是不正确的。具体来说,除了最后一个版本的问题外,他在等待()之前有一个
线程。sleep(10000)
,这基本上保证了“永远”的等待。是的,我看到了@rolfl。如果这是一个隐含的问题,我当然不会否决你的答案。:-)不,否决票并不能使我相形见绌。我真的很恼火,OP把问题搞得一团糟,浪费了很多人的时间。。。。感觉他不配……同意@rolfl。我通常认为他们不知道自己做错了什么。95%的人不知道他们应该为子孙后代而不是他们的小宠物问题提问/回答。