使用 java.util.concurrent 阻止操作直到列表变为非空
Block actions till list becomes non-empty with java.util.concurrent
我需要你的帮助。我应该在练习中使用 java.util.concurrent 包,但我不知道该怎么做。问题只是关于get方法。
public String getInput() {
if (inputList.isEmpty()) return null;
String input = inputList.get(0);
inputList.remove(0);
return input;
}
我需要如何编写代码来等待给定列表(变量:inputList)变为非空?
问候
您可以尝试使用 java.util.concurrent
中的 LinkedBlockingDeque
class
实现 BlockingDeque
接口的包。
它允许您将项目添加到 BlockingDeque
和 take*
方法块,直到有可用的元素并在获取后将其删除。看看 Javadoc
这是一个例子:
public class Queue {
BlockingDeque<String> inputList = new LinkedBlockingDeque<>();
public String getInput() {
try {
System.out.println("waiting on queue");
String input = inputList.takeFirst();
System.out.println("taken " + input);
return input;
} catch (InterruptedException e) {
e.printStackTrace();
return null;
}
}
public static void main(String[] args) {
Queue queue = new Queue();
new Thread(() -> {
try {
Thread.sleep(4000);
queue.inputList.add("string");
System.out.println("added string");
Thread.sleep(2000);
queue.inputList.add("string1");
System.out.println("added string 1");
} catch (InterruptedException e) {
e.printStackTrace();
}
}).start();
for (int i = 0; i < 2; i++){
queue.getInput();
}
}
}
我需要你的帮助。我应该在练习中使用 java.util.concurrent 包,但我不知道该怎么做。问题只是关于get方法。
public String getInput() {
if (inputList.isEmpty()) return null;
String input = inputList.get(0);
inputList.remove(0);
return input;
}
我需要如何编写代码来等待给定列表(变量:inputList)变为非空?
问候
您可以尝试使用 java.util.concurrent
中的 LinkedBlockingDeque
class
实现 BlockingDeque
接口的包。
它允许您将项目添加到 BlockingDeque
和 take*
方法块,直到有可用的元素并在获取后将其删除。看看 Javadoc
这是一个例子:
public class Queue {
BlockingDeque<String> inputList = new LinkedBlockingDeque<>();
public String getInput() {
try {
System.out.println("waiting on queue");
String input = inputList.takeFirst();
System.out.println("taken " + input);
return input;
} catch (InterruptedException e) {
e.printStackTrace();
return null;
}
}
public static void main(String[] args) {
Queue queue = new Queue();
new Thread(() -> {
try {
Thread.sleep(4000);
queue.inputList.add("string");
System.out.println("added string");
Thread.sleep(2000);
queue.inputList.add("string1");
System.out.println("added string 1");
} catch (InterruptedException e) {
e.printStackTrace();
}
}).start();
for (int i = 0; i < 2; i++){
queue.getInput();
}
}
}