Java 从2个或更多类访问同一变量

Java 从2个或更多类访问同一变量,java,Java,以下是我的主要观点: public static void main(String[] args){ java.util.ArrayList data_queue=new java.util.ArrayList(); Producer p = new Producer(data_queue); Consumer c = new Consumer(data_queue); p.start(); c.start(); System.out.printl

以下是我的主要观点:

public static void main(String[] args){
    java.util.ArrayList data_queue=new java.util.ArrayList();
    Producer p = new Producer(data_queue);
    Consumer c = new Consumer(data_queue);
    p.start();
    c.start();
    System.out.println(“Random Week Day:”);
}

class Producer extends Thread{
    ArrayList data_queue;
    public Producer(ArrayList data_queue){
        this.data_queue=data_queue;
    }
    public void run(){
        //your code; Create random week day, Add
    }
}

class Consumer extends Thread{
    ArrayList data_queue;
    public Consumer(ArrayList data_queue){
        this.data_queue=data_queue;
    }
    public void run(){
        //your code: Remove, display
    }
}
制作人创建随机工作日,最后添加到ArrayList->并打印 消费者获取此ArrayList中的第一个元素->删除它->并打印


若我不能在主功能中编辑任何内容,只需在生产者和消费者中进行更改。我如何访问同一个变量(ArrayList data\u queue)以通过线程添加和删除

我猜您的老师希望您使用
data\u queue.wait()
data\u queue.notifyAll()
。消费者应在队列为空时等待,生产者应在每次将元素放入队列时通知消费者


仔细阅读这些方法的javadoc(在java.lang.Object中),因为它们很难使用低级同步机制。这也是一个很好的参考。

我猜你的老师希望你使用
数据队列。wait()
数据队列。notifyAll()
。消费者应在队列为空时等待,生产者应在每次将元素放入队列时通知消费者


仔细阅读这些方法的javadoc(在java.lang.Object中),因为它们很难使用低级同步机制。这也是一个很好的参考。

您已经在访问同一个对象。您只调用了一次
new
,因此只有一个ArrayList已传递给所有人。不要忘记注意线程之间的同步,如:

List<String> list = Collections.synchronizedList(new ArrayList<String>());
List List=Collections.synchronizedList(新的ArrayList());

您已经在访问同一个对象。您只调用了一次
new
,因此只有一个ArrayList已传递给所有人。不要忘记注意线程之间的同步,如:

List<String> list = Collections.synchronizedList(new ArrayList<String>());
List List=Collections.synchronizedList(新的ArrayList());

为什么不使用同步方法?为什么访问数组列表会有问题?在主方法中实例化的ARRAYLIST被传递给消费类和生产者类的构造函数,并且可以作为这些类中的实例变量可用……对于实际的生产代码,考虑使用Addio.@ JTrackCK,事实上,仅仅在DATAAQueLead上进行同步可能是不够的。如果这样做,就不能保证使用者线程不会在生产者线程之前获得锁。@Alderath,我知道。这只是一个初步建议。:)为什么不使用同步方法?为什么访问数组列表会有问题?在主方法中实例化的ARRAYLIST被传递给消费类和生产者类的构造函数,并且可以作为这些类中的实例变量可用……对于实际的生产代码,考虑使用Addio.@ JTrackCK,事实上,仅仅在DATAAQueLead上进行同步可能是不够的。如果这样做,就不能保证使用者线程不会在生产者线程之前获得锁。@Alderath,我知道。这只是一个初步建议。:)我哥哥有一个练习,他的老师想用这个主要功能,不要改变这个。我只是在生产者和消费者处更改代码,但若不更改main func,则无法同步ArrayList的值。结果总是:添加:星期五随机工作日:删除:星期五添加:星期三添加:星期六添加:星期四添加:星期一首先,我不是你的兄弟。第二,没有必要大喊大叫。第三,我在哪里告诉过您修改main方法中的任何内容?为什么不能从使用者的运行方法和生产者的运行方法同步列表?你试过什么吗?我哥哥有一个练习,他的老师想用这个主要功能,不要改变这个。我只是在生产者和消费者处更改代码,但若不更改main func,则无法同步ArrayList的值。结果总是:添加:星期五随机工作日:删除:星期五添加:星期三添加:星期六添加:星期四添加:星期一首先,我不是你的兄弟。第二,没有必要大喊大叫。第三,我在哪里告诉过您修改main方法中的任何内容?为什么不能从使用者的运行方法和生产者的运行方法同步列表?你试过什么吗?