Java 交换器似乎没有交换()

Java 交换器似乎没有交换(),java,multithreading,concurrency,jsr166,Java,Multithreading,Concurrency,Jsr166,我有一个非常简单的问题,我尝试在两个任务:生产者和消费者之间交换一个对象(在本例中是一个int数组)。Producer类生成一个int数组,然后尝试使用Exchanger对象与Consumer数组(一个空数组)进行交换。但它似乎不起作用:当消费者试图打印数组时,它什么也得不到 public class Producer implements Runnable{ private Exchanger<List<Integer>> exchanger; private List

我有一个非常简单的问题,我尝试在两个任务:生产者和消费者之间交换一个对象(在本例中是一个int数组)。Producer类生成一个int数组,然后尝试使用Exchanger对象与Consumer数组(一个空数组)进行交换。但它似乎不起作用:当消费者试图打印数组时,它什么也得不到

public class Producer implements Runnable{
private Exchanger<List<Integer>> exchanger;
private List<Integer> ints = new ArrayList<Integer>();

public Producer(Exchanger<List<Integer>> ex) {
    this.exchanger = ex;
}

public void run() {
    RandomGenerator.Integer gen = new RandomGenerator.Integer();
    try{
    while(!Thread.interrupted()) {
        for (int i = 0;i < Test.LIST_SIZE;i++) 
            ints.add(gen.next());
        exchanger.exchange(ints);
        //for(Integer x : ints) 
            //System.out.print(" " + x);
        //System.out.println();
    }
    }catch(InterruptedException e) {
        System.out.println("Producer interrupted");
    }
}
}


public class Consumer implements Runnable {
private Exchanger<List<Integer>> exchanger;
private List<Integer> ints = new ArrayList<Integer>();

public Consumer(Exchanger<List<Integer>> ex) {
    this.exchanger = ex;
}

public void run() {
    try{
    while(!Thread.interrupted()) {
        exchanger.exchange(ints);
        System.out.println("Consumer:");
        for(Integer x : ints) {
            System.out.print(" " + x);
            ints.remove(x);
        }
        System.out.println();
    }
    } catch(InterruptedException e) {
        System.out.println("Consumer interrupted");
    }
}
}


public class Test {
public static final int LIST_SIZE = 10;

public static void main(String[] args) throws InterruptedException {
    ExecutorService exec = Executors.newCachedThreadPool();
    Exchanger<List<Integer>> exchanger = new Exchanger<List<Integer>>();
    exec.execute(new Producer(exchanger));
    exec.execute(new Consumer(exchanger));
    TimeUnit.MILLISECONDS.sleep(5);
    exec.shutdownNow();
}
公共类生成器实现可运行{
专用交换机;
private List ints=new ArrayList();
公共制作人(交易所交易所交易所){
这个是exchanger=ex;
}
公开募捐{
RandomGenerator.Integer gen=新的RandomGenerator.Integer();
试一试{
而(!Thread.interrupted()){
对于(int i=0;i

如果我取消对Producer中的行的注释,我会看到生成的数字仍然存在。那么为什么它不交换对象呢?

交换程序不会在适当的位置交换引用,而是返回交换的对象。因此,您应该编写如下内容:

List<Integer> received = exchanger.exchange(ints);
System.out.println("Consumer:");
for(Integer x : received) {
    System.out.print(" " + x);
        ...
}
List received=exchange.exchange(ints);
System.out.println(“消费者:”);
for(整数x:已接收){
系统输出打印(“+x”);
...
}

顺便说一句,我认为交换器不适合生产者/消费者…

交换并不神奇;交换器对象无法替换对象引用本身。文档告诉我们,一旦到达交换点,调用函数将返回另一个线程提供的对象,这就是我们“接收”的方式实际上,我没有做过任何操作,但我假设您打算将此结果分配回;即
ints=exchanger.exchange(ints)
在两个类中。

等等:你有一个生产者、消费者和一个交换器,所有这些都是你自己编写的;而交换器似乎不工作;所以你给我们看生产者、消费者,但不是交换器?生产者、消费者和随机生成器。整数类我自己编写,但交换器类是在中实现的java库:这是问题之一。我还必须将ArrayList更改为CopyOnWriteArrayList@Joordy如果您仍然需要同步列表(CopyOnWriteArrayList),您仍然在做一些非常错误的事情。您仍然没有正确使用Exchange。Exchange和synchronized list是两种互斥的方法。@paradigmatic我也认为Exchange不适合生产者/消费者,但这是他们在中给出的示例。