Программа потока Java работает в Eclipse, но не в терминале / командной строке - PullRequest
0 голосов
/ 12 апреля 2011

Этот код отлично работает в затмении, но не в командной строке (или терминале).Любая помощь будет принята с благодарностью, так как я понятия не имею, почему она не работает.Он полностью выполняется в Eclipse, но зависает во время выполнения в командной строке.

Класс Producer генерирует случайные значения типа double и вызывает add (), в то время как класс Consumer вызывает pop ();оба вызывают их 1 000 000 раз.

Buffer.java

public class Buffer{

private double[] buf;
private int next = 0;
private int start = 0;
private int semaphore = 1;
private boolean isFull = false;
private boolean isEmpty = true;

public static void main(String[] args) {
    Buffer pcbuf = new Buffer(1000);
    Thread prod = new Thread (new Producer(pcbuf));
    Thread cons = new Thread (new Consumer(pcbuf));
    prod.start();
    cons.start();
}

public Buffer(int size){
    buf = new double[size];
}

private synchronized void bwait(){
    while(semaphore <= 0){}
    semaphore--;
}

private void bnotify(){
    semaphore++;
}

public void add(double toAdd){
    boolean hasAdded = false;
    while(!hasAdded){
        if(!isFull){
            bwait();
            buf[next] = toAdd;
            next=(next+1)%buf.length;
            if(next == start){
                isFull = true;
            }
            isEmpty = false;
            hasAdded = true;
            bnotify();
        }
    }
}

public double pop(){
    boolean hasPopped = false;
    double toReturn = 0.0;
    while(!hasPopped){
        if(!isEmpty){
            bwait();
            toReturn = buf[start];
            start=(start+1)%buf.length;
            if(start == next){
                isEmpty = true;
            }
            isFull = false;
            hasPopped = true;
            bnotify();
        }
    }
    return toReturn;
}
}

Producer.java

import java.text.DecimalFormat;
import java.util.Random;

public class Producer extends Thread{

private Buffer b;
private double bufferValueCounter = 0.0;
private int numProduced = 0;

public Producer(Buffer b){
    this.b = b;
}

public void run() {
    Random r = new Random();
    DecimalFormat df = new DecimalFormat("#,###");
    while (numProduced < 1000000){
        double toAdd = r.nextDouble() * 100.0;
        b.add(toAdd);
        bufferValueCounter+=toAdd;
        numProduced++;
        if(numProduced%100000==0){
            System.out.println("Producer: Generated " + df.format(numProduced) + " items, Cumulative value of generated items = " + bufferValueCounter);
        }
    }
    System.out.println("Producer: Finished generating 1,000,000 items");
}   
}

Consumer.java

import java.text.DecimalFormat;

public class Consumer extends Thread{

private Buffer b;
private double bufferValueCounter = 0.0;
private int numConsumed = 0;

public Consumer(Buffer b){
    this.b = b;
}

public void run(){
    DecimalFormat df = new DecimalFormat("#,###");
    while(numConsumed < 1000000){
        double popped = b.pop();
        bufferValueCounter += popped;
        numConsumed++;
        if(numConsumed%100000==0){
            System.out.println("Consumer: Consumed  " + df.format(numConsumed) + " items, Cumulative value of consumed items  = " + bufferValueCounter);
        }
    }
    System.out.println("Consumer: Finished consuming 1,000,000 items");
}
}

1 Ответ

0 голосов
/ 12 мая 2012

Вам нужно синхронизироваться, чтобы всплывать и добавлять методы. Я думаю, что это должно решить проблему.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...