Пример взят отсюда. Кто знает почему collectAssignment возвращает не более 2х анкет? В консоли 10 в submit и не более двух в collect.
package com.company;
import java.util.ArrayList;
import java.util.List;
// Sample class
public class ClassRoom {
private int numOfSubmitted = 0;
private int numOfCollected = 0;
private Object object = null;
// Volatile shared variable
private volatile boolean newObject = false;
public static void main(String[] args) throws InterruptedException {
ClassRoom classRoom = new ClassRoom();
Thread one = new Thread(() -> {
for (int i = 0; i < 10; i++) {
Object o = new Object();
classRoom.submitObject(o);
}
});
List<Object> list = new ArrayList<>();
Thread two = new Thread(() -> {
while (!one.isInterrupted()) {
list.add(classRoom.collectObject());
}
});
one.start();
two.start();
one.setPriority(1);
two.setPriority(10);
Thread.sleep(100);
System.out.println(classRoom);
System.out.println(list);
}
// Used by Thread 1
public void submitObject(Object object) {
// This keyword refers to current instance itself
// 1
this.object = object;
// 2
this.numOfSubmitted++;
// 3
this.newObject = true;
}
// Method 2
// Used by Thread 2
public Object collectObject() {
while (!newObject) {// Wait until a new assignment is submitted
}
Object collectedObject = this.object;
this.numOfCollected++;
this.newObject = false;
return collectedObject;
}
@Override
public String toString() {
return "ClassRoom{" +
"numOfSubmitted=" + numOfSubmitted +
", numOfCollected=" + numOfCollected +
", object=" + object +
", newObject=" + newObject +
'}';
}
}