每个人!
我写了一个InAndOut
扩展类()Thread
。此类在构造函数中接收两个LinkedConcurrentQueue
,entrance
和exit
, 我的run
方法将对象从 转移entrance
到exit
。
在我的主要方法中,我实例化了两个LinkedConcurrentQueue
,myQueue1
和myQueue2
, 每个都有一些值。然后,我实例化了两个 InAndOut,一个接收myQueue1
(入口)和myQueue2
(出口),另一个接收myQueue2
(入口)和myQueue1
(出口)。然后,我调用两个实例的 start 方法。
结果,经过一些迭代,所有对象都从一个队列转移到另一个队列,换句话说,myQueue1
变为空并myQueue2
“窃取”所有对象。但是,如果我在每次迭代中添加一个睡眠调用(大约 100 毫秒),那么行为就像我预期的那样(两个队列中元素编号之间的平衡)。
为什么会发生以及如何解决?有一些方法可以不在我的运行方法中使用这个睡眠调用吗?难道我做错了什么?
这是我的源代码:
import java.util.concurrent.ConcurrentLinkedQueue;
class InAndOut extends Thread {
ConcurrentLinkedQueue<String> entrance;
ConcurrentLinkedQueue<String> exit;
String name;
public InAndOut(String name, ConcurrentLinkedQueue<String> entrance, ConcurrentLinkedQueue<String> exit){
this.entrance = entrance;
this.exit = exit;
this.name = name;
}
public void run() {
int it = 0;
while(it < 3000){
String value = entrance.poll();
if(value != null){
exit.offer(value);
System.err.println(this.name + " / entrance: " + entrance.size() + " / exit: " + exit.size());
}
//THIS IS THE SLEEP CALL THAT MAKES THE CODE WORK AS EXPECTED
try{
this.sleep(100);
} catch (Exception ex){
}
it++;
}
}
}
public class Main {
public static void main(String[] args) {
ConcurrentLinkedQueue<String> myQueue1 = new ConcurrentLinkedQueue<String>();
ConcurrentLinkedQueue<String> myQueue2 = new ConcurrentLinkedQueue<String>();
myQueue1.offer("a");
myQueue1.offer("b");
myQueue1.offer("c");
myQueue1.offer("d");
myQueue1.offer("e");
myQueue1.offer("f");
myQueue1.offer("g");
myQueue1.offer("h");
myQueue1.offer("i");
myQueue1.offer("j");
myQueue1.offer("k");
myQueue1.offer("l");
myQueue2.offer("m");
myQueue2.offer("n");
myQueue2.offer("o");
myQueue2.offer("p");
myQueue2.offer("q");
myQueue2.offer("r");
myQueue2.offer("s");
myQueue2.offer("t");
myQueue2.offer("u");
myQueue2.offer("v");
myQueue2.offer("w");
InAndOut es = new InAndOut("First", myQueue1, myQueue2);
InAndOut es2 = new InAndOut("Second", myQueue2, myQueue1);
es.start();
es2.start();
}
}
提前致谢!