有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

多线程需要帮助找出Java中基本多线程代码的错误(多个生产者一个消费者)

当运行这段代码时,我会遇到大量毫无意义的异常(对我来说)。不知道我会在哪里犯错。。。 基本上,我希望我的制作人将alpha字符放入缓冲区,消费者从缓冲区中获取它们并打印出来。我刚刚开始学习多线程,我不知道这段代码中可能存在什么问题。我试着在课堂上实现这个例子。如果这是个愚蠢的问题,我真的很抱歉

public class Driver {
    public static void main(String[] args) {
        new Consumer("Consumer1");
        new Consumer("Consumer2");
        new Consumer("Consumer3");
        new Producer("Producer1");
    }   
}
public class Producer implements Runnable{

    private Buffer buf = null;

    public Producer(String name){
        buf = Buffer.getInstance();
        new Thread(this, name).start();
    }

    public void run(){
        char character = 'A';

        for(; character < 'Z'; character ++){
            buf.put(character);
            System.out.println("Producer " + Thread.currentThread().getName() + " puts " + character);
        }

        Consumer.done = true;
    }
}
public class Buffer {

    private static Buffer instance = null;
    private boolean full = false;
    private boolean empty = true;

    private char[] arr;
    private int i;

    private Buffer(){
        arr = new char[26];
        i = 0;
    }

    public static synchronized Buffer getInstance(){
        if(instance != null){
            instance = new Buffer();
        }
        return instance;
    }

    public synchronized void put(char c){
        while(full){
            try{
                wait();
            }catch(Exception e){}
        }

        arr[i++] = c;
        empty = false;
        if(i == 25){
            full = true;
            notifyAll();
        }else{
            full = false;
        }
    }

    public synchronized char get(){
        while(empty){
            try{
                wait();
            }catch(Exception e){}
        }

        if(--i == 0){
            empty = true;
        }else{
            notifyAll();
        }
        full = false;
        return arr[i];
    }

}

public class Consumer implements Runnable{

    private Buffer buf = null;
    public static boolean done = false;

    public Consumer(String name){
        buf = Buffer.getInstance();
        new Thread(this, name).start();
    }

    public void run(){      
        while(!done){
            System.out.println("Producer " + Thread.currentThread().getName() + " gets " + buf.get());
        }
    }
}



Exception in thread "Consumer2" Exception in thread "Consumer3" Exception in thread "Consumer1" Exception in thread "Producer1" java.lang.NullPointerException
    at Producer_consumer.Consumer.run(Consumer.java:15)
    at java.lang.Thread.run(Thread.java:745)
java.lang.NullPointerException
    at Producer_consumer.Consumer.run(Consumer.java:15)
    at java.lang.Thread.run(Thread.java:745)
java.lang.NullPointerException
    at Producer_consumer.Producer.run(Producer.java:16)
    at java.lang.Thread.run(Thread.java:745)
java.lang.NullPointerException
    at Producer_consumer.Consumer.run(Consumer.java:15)
    at java.lang.Thread.run(Thread.java:745)

共 (1) 个答案

  1. # 1 楼答案

    如果Buffer::getInstance方法的null检查方法错误,请将其更改为

    public static synchronized Buffer getInstance(){
        if(instance == null){
            instance = new Buffer();
        }
        return instance;
    }