这是一个经典的排队问题。应该放一个数字并得到相同的数字。这应该永远持续下去。
我的老师使用此问题来演示wait()的用法。 但是我的处理方式有所不同。
this.valService.checkVal(email,pwd).subscribe((data : any)=>{
},
(err : HttpErrorResponse)=>{
this.isLoginError = true;
});
然后,主要是将同一个Q对象链接到消费者和生产者。 然后,我启动了两个线程(消费者对象和生产者对象)。
代码在一些数字(例如48,84等)之后停止。 但我认为这应该是一个无限循环。
答案 0 :(得分:0)
您的代码中存在多个问题。
首先,即使是getter和setter也不是线程安全的。 在生产者的run()中for循环的主体中
if(q.isReady())
{
q.get();
q.setReady(false);
}
...
q.isReady()和if的正文可能不会在一行之后执行。
有两种方法可以解决此问题:
1。同步获取器和设置器
public synchronized void setReady(boolean ready) {
Ready = ready;
}
public synchronized boolean isReady() {
return Ready;
}
2。同步需要“原子”执行的部分
3。您执行线程错误
如果您只启动一个生产者和一个消费者...
您错误地启动了线程 如果您的主要方法只是这样:
...
Consumer1.start();
producer1.start();
}
这里的问题是您不必等待线程完成。即使线程应该继续运行,您的主线程也会在启动其他线程后停止执行。 JVM将在某些时候清理丢失的线程(当您丢失对它们的参照时,它们将不会永远运行)。
只需调用Consumer1.join()或procer1.join()(或两者)即可对其进行修复。