- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
大家!
我编写了一个扩展Thread
的类(InAndOut
)。该类在构造函数中接收两个 LinkedConcurrentQueue
、entrance
和 exit
,并且我的 run
方法从 入口
到导出
。
在我的主方法中,我实例化了两个 LinkedConcurrentQueue
、myQueue1
和 myQueue2
,每个队列都有一些值。然后,我实例化了两个 InAndOut,一个接收 myQueue1
(入口)和 myQueue2
(导出),另一个接收 myQueue2
(入口)和 myQueue1
(退出)。然后,我调用两个实例的 start 方法。
经过一些迭代后,结果是将所有对象从一个队列转移到另一个队列,换句话说,myQueue1
变空,myQueue2
“窃取”所有对象对象。但是,如果我在每次迭代中添加 sleep 调用(大约 100 毫秒),那么行为就像我预期的那样(两个队列中的元素数量之间达到平衡)。
为什么会发生这种情况以及如何解决?有什么方法可以不在我的 run 方法中使用这个 sleep 调用?我做错了什么吗?
这是我的源代码:
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();
}
}
提前致谢!
最佳答案
即使线程调度是确定性的,观察到的行为仍然是合理的。只要两个线程执行相同的任务,它们就可能平衡运行,尽管您不能依赖。但一旦一个队列空了,任务就不再平衡了。比较:
线程 1 从包含项目的队列中进行轮询。 poll 方法将修改源队列的状态以反射(reflect)删除,您的代码将接收到的项目插入到另一个队列中,创建一个内部列表节点对象并修改目标队列的状态以反射(reflect)插入。所有修改均以其他线程可见的方式执行。
从空队列中线程化两个轮询。 poll
方法检查引用并找到 null
就这样了。不执行任何其他操作。
我认为很明显,一旦一个队列变空,一个线程就会比另一个线程有更多的事情要做。更准确地说,一个线程可以完成 3000 次循环迭代(甚至可以完成 300000 次),而另一个线程甚至不足以执行一次迭代。
因此,一旦一个队列为空,一个线程几乎立即完成其循环,之后另一个线程会将所有项目从一个队列传输到另一个队列,然后也完成。
因此,即使具有几乎确定性的调度行为,一旦一个队列碰巧变空,平衡也始终会面临倾斜的风险。
<小时/>您可以通过向队列添加更多项目来降低一个队列空载的可能性,从而提高平衡运行的机会。您可以提高迭代次数(远大于一百万),以避免线程在队列为空时立即退出,或者仅在看到非 null
项时才增加计数器。您可以使用 CountDownLatch让两个线程在进入循环之前等待,补偿线程启动开销,使它们尽可能同步运行。
但是,请记住,它仍然是不确定的,并且轮询循环会浪费 CPU 资源。机器人尝试学习是可以的。
关于java - 两个线程在两个 LinkedConcurrentQueue 之间以双向方式传输数据会导致一个队列为空,而另一个队列则为 "steals"所有内容,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19913801/
我已经为使用 JGroups 编写了简单的测试。有两个像这样的简单应用程序 import org.jgroups.*; import org.jgroups.conf.ConfiguratorFact
我有一个通过 ajax 检索的 json 编码数据集。我尝试检索的一些数据点将返回 null 或空。 但是,我不希望将那些 null 或空值显示给最终用户,或传递给其他函数。 我现在正在做的是检查
这个问题在这里已经有了答案: 关闭 11 年前。 Possible Duplicate: Why does one often see “null != variable” instead of “
嗨在我们公司,他们遵循与空值进行比较的严格规则。当我编码 if(variable!=null) 在代码审查中,我收到了对此的评论,将其更改为 if(null!=variable)。上面的代码对性能有影
我正在尝试使用 native Cordova QR 扫描仪插件编译项目,但是我不断收到此错误。据我了解,这是代码编写方式的问题,它向构造函数发送了错误的值,或者根本就没有找到构造函数。那么我该如何解决
我在装有 Java 1.8 的 Windows 10 上使用 Apache Nutch 1.14。我已按照 https://wiki.apache.org/nutch/NutchTutorial 中提
这个问题已经有答案了: 已关闭11 年前。 Possible Duplicate: what is “=null” and “ IS NULL” Is there any difference bet
Three-EyedRaven 内网渗透初期,我们都希望可以豪无遗漏的尽最大可能打开目标内网攻击面,故,设计该工具的初衷是解决某些工具内网探测速率慢、运行卡死、服务爆破误报率高以及socks流
我想在Scala中像在Java中那样做: public void recv(String from) { recv(from, null); } public void recv(String
我正在尝试从一组图像补丁中创建一个密码本。我已将图像(Caltech 101)分成20 X 20图像块。我想为每个补丁创建一个SIFT描述符。但是对于某些图像补丁,它不返回任何描述符/关键点。我尝试使
我在验证器类中自动连接的两个服务有问题。这些服务工作正常,因为在我的 Controller 中是自动连接的。我有一个 applicationContext.xml 文件和 MyApp-servlet.
已关闭。此问题不符合Stack Overflow guidelines 。目前不接受答案。 已关闭10 年前。 问题必须表现出对要解决的问题的最低程度的了解。告诉我们您尝试过做什么,为什么不起作用,以
大家好,我正在对数据库进行正常的选择,但是 mysql_num_rowsis 为空,我不知道为什么,我有 7 行选择。 如果您发现问题,请告诉我。 真的谢谢。 代码如下: function get_b
我想以以下格式创建一个字符串:id[]=%@&stringdata[]=%@&id[]=%@&stringdata[]=%@&id[]=%@&stringdata[]=%@&等,在for循环中,我得到
我正在尝试使用以下代码将URL转换为字符串: NSURL *urlOfOpenedFile = _service.myURLRequest.URL; NSString *fileThatWasOpen
我正在尝试将NSNumber传递到正在工作的UInt32中。然后,我试图将UInt32填充到NSData对象中。但是,这在这里变得有些时髦... 当我尝试将NSData对象中的内容写成它返回的字符串(
我正在进行身份验证并收到空 cookie。我想存储这个 cookie,但服务器没有返回给我 cookie。但响应代码是 200 ok。 httpConn.setRequestProperty(
我认为 Button bTutorial1 = (Button) findViewById(R.layout.tutorial1); bTutorial1.setOnClickListener
我的 Controller 中有这样的东西: model.attribute("hiringManagerMap",hiringManagerMap); 我正在访问此 hiringManagerMap
我想知道如何以正确的方式清空列表。在 div 中有一个列表然后清空 div 或列表更好吗? 我知道这是一个蹩脚的问题,但请帮助我理解这个 empty() 函数:) 案例)如果我运行这个脚本会发生什么:
我是一名优秀的程序员,十分优秀!