真的需要你的帮助来弄清楚发生了什么。代码似乎是如此微不足道,但它会产生错误的输出。
这是一个基本的生产者 - 消费者问题。生成器线程生成素数,消费者(acceptors)
必须处理它们。在App中我创建了两个接受器和一个生成器线程。问题是我得到50的以下输出为绑定:
Thread Thread-2 puts 47
Thread Thread-2 puts 43
Thread Rob gets 47
Thread Rob gets 43
Thread Thread-1 gets 47
Thread Nick puts 47
etc...
我不知道为什么要打印Thread-2和Thread-1 ......这些线程来自哪里?感谢
public class PrimeGenerator implements Runnable{
private PrimeCentral primeCentral;
int bound;
public PrimeGenerator(PrimeCentral PC, int bound){
this.primeCentral = PC;
this.bound = bound;
new Thread(this).start();
}
@Override
public void run() {
int n=bound;
while (n > 1) {
int d;
for (d=2; d <= n/2; d++)
if ((n % d) == 0) break;
if (d > n/2) {
primeCentral.put(n);
System.out.println("Thread " + Thread.currentThread().getName() + " puts " + n);
}
n--;
}
}
}
public class PrimeCentral {
private int prime;
private boolean available = false;
public synchronized void put(int n){
while(available == true){
try{
wait();
}catch(InterruptedException e){}
}
prime = n;
available = true;
notifyAll();
}
public synchronized int get(){
while(available == false){
try{
wait();
}catch(InterruptedException e){}
}
available = false;
notifyAll();
return prime;
}
}
public class PrimeAcceptor implements Runnable{
private PrimeCentral primeCentral;
public PrimeAcceptor(PrimeCentral primeCentral){
this.primeCentral = primeCentral;
new Thread(this).start();
}
public void run() {
while (true) {
int prime = primeCentral.get();
System.out.println("Thread " + Thread.currentThread().getName() + " gets " + prime);
if (prime == 2) break;
}
}
public class App {
public static void main(String[] args) {
PrimeCentral pc = new PrimeCentral();
new Thread(new PrimeAcceptor(pc), "Bob").start();
new Thread(new PrimeAcceptor(pc), "Rob").start();
new Thread(new PrimeGenerator(pc, 50), "Nick").start();
}
}
编辑:对不起那些人,我对这个愚蠢的错误感到愚蠢
答案 0 :(得分:2)
您正在使用new Thread(this).start().
他们都会有您提到的表格的名称。
我认为你正在开始四个线程,你只想开始两个。在它出现的两个地方删除上面的行。