Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/node.js/40.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用复制运行时的Java线程_Java_Multithreading_Concurrency - Fatal编程技术网

使用复制运行时的Java线程

使用复制运行时的Java线程,java,multithreading,concurrency,Java,Multithreading,Concurrency,我写的一些Java代码有一个非常奇怪的bug。如果我运行我编写的一些并行代码,它会运行得很好,但是如果我在同一次运行中多次运行同一代码,运行时就会越来越慢 如果我将线程数从4个增加到8个,那么每次迭代的速度会更慢 每次运行都是完全独立的,我甚至将运行时变量设置为null以清除旧运行。所以我不知道是什么让它慢下来。我一直在使用VisualVM,它说.run()把所有的时间都花在“Self-time”或“Thread.init()”上,这是没有帮助的 一些代码片段: for (int r = 0;

我写的一些Java代码有一个非常奇怪的bug。如果我运行我编写的一些并行代码,它会运行得很好,但是如果我在同一次运行中多次运行同一代码,运行时就会越来越慢

如果我将线程数从4个增加到8个,那么每次迭代的速度会更慢

每次运行都是完全独立的,我甚至将运行时变量设置为null以清除旧运行。所以我不知道是什么让它慢下来。我一直在使用VisualVM,它说.run()把所有的时间都花在“Self-time”或“Thread.init()”上,这是没有帮助的

一些代码片段:

for (int r = 0; r < replicateRuns; ++r) {
    startTime = System.nanoTime();
    result = newRuntime.execute();
    result = null;
    System.out.println((System.nanoTime() - startTime) / 1000000);
    total += System.nanoTime() - startTime;
}
for(int r=0;r

parentThread=this;
线程=新线程[线程数];
屏障=新的循环载体(螺纹数);
for(int i=0;i
所以,如果我多次启动Java应用程序,我会得到不错的结果,但是如果我在同一次启动中多次运行它,那么一切都会变慢,即使就我所见,我正在将所有内容都置为空,所以GC会来清理它

我使用的是线程局部变量,但从我读到的内容来看,当线程本身设置为null时,它们都被清除了

为任何帮助干杯

编辑1:

谢谢你的帮助。情节变厚了,在我的Windows桌面上(与我的MacBook相反),根本没有任何问题,每个线程都可以正常运行,即使我增加了运行量,其间也不会减速!在看了一天之后,我将在早上的第一件事上再次尝试使用Eclipse MAT


关于源代码,我正在用MOEAD的并行版本扩展MOEA框架,因此有许多依赖项和类。你可以找到我班级的来源。本质上,反复调用iterate,直到numberofevaluation达到一个设定值。

我相信大家在这里说的问题是,你没有以正确的方式“停止”你的线程

根据我的经验,最好的方法是将状态存储在一个线程中,存储在一个布尔变量中,例如
isRunning
。然后在循环中测试
isRunning
标志的状态,即

//inside the run method
while(isRunning){
//your code goes here
}
这样,在循环的每次迭代中,您都会检查标志的当前状态,因此,您将在自定义
stop()
方法中将其设置为“false”。循环的下一次迭代将导致线程退出其
run
方法,从而结束线程的生命周期。从技术上讲,现在它可以被垃圾收集了。它的内存将在不久的将来的某个时候释放,考虑到在代码中的某个地方没有挂起这种威胁的引用

有更多的资料显示了这种方法,例如,Checkout


作为旁注,了解
新运行时
结果
变量的确切含义将非常有用,它们的类和继承等。否则,我们只能尝试猜测代码中到底发生了什么。

我相信大家在这里说的问题是,你没有以正确的方式“停止”线程

根据我的经验,最好的方法是将状态存储在一个线程中,存储在一个布尔变量中,例如
isRunning
。然后在循环中测试
isRunning
标志的状态,即

//inside the run method
while(isRunning){
//your code goes here
}
这样,在循环的每次迭代中,您都会检查标志的当前状态,因此,您将在自定义
stop()
方法中将其设置为“false”。循环的下一次迭代将导致线程退出其
run
方法,从而结束线程的生命周期。从技术上讲,现在它可以被垃圾收集了。它的内存将在不久的将来的某个时候释放,考虑到在代码中的某个地方没有挂起这种威胁的引用

有更多的资料显示了这种方法,例如,Checkout


作为旁注,了解
新运行时
结果
变量、它们的类和继承等的确切内容实际上是很有用的。否则,我们只能尝试猜测代码中到底发生了什么。

您总是在生成新线程,从不处理它们。 如果线程数大于处理器内核数,我们必须切换线程,这会使性能降低约1000倍。
如果您使用的是Netbeans IDE,您可以在profiler中查看线程及其状态。

您总是在生成新线程,而从不处理它们。 如果线程数大于处理器内核数,我们必须切换线程,这会使性能降低约1000倍。
如果您使用的是Netbeans IDE,您可以在profiler中查看线程及其状态。

要更快获得更好的帮助,您应该尝试创建一个新的。这样,人们将能够测试您的代码,重现问题,并可能发现问题。例如,在不知道新运行时(…)
是什么的情况下,很难对您的问题进行推理。我们的想法是从代码中提取一个复制行为的最小可编译示例。为线程设置空值没有多大作用-如果线程仍在运行,它将不会被垃圾收集。“将线程设置为空”是一个有意义的问题