使用复制运行时的Java线程
我写的一些Java代码有一个非常奇怪的bug。如果我运行我编写的一些并行代码,它会运行得很好,但是如果我在同一次运行中多次运行同一代码,运行时就会越来越慢 如果我将线程数从4个增加到8个,那么每次迭代的速度会更慢 每次运行都是完全独立的,我甚至将运行时变量设置为null以清除旧运行。所以我不知道是什么让它慢下来。我一直在使用VisualVM,它说.run()把所有的时间都花在“Self-time”或“Thread.init()”上,这是没有帮助的 一些代码片段:使用复制运行时的Java线程,java,multithreading,concurrency,Java,Multithreading,Concurrency,我写的一些Java代码有一个非常奇怪的bug。如果我运行我编写的一些并行代码,它会运行得很好,但是如果我在同一次运行中多次运行同一代码,运行时就会越来越慢 如果我将线程数从4个增加到8个,那么每次迭代的速度会更慢 每次运行都是完全独立的,我甚至将运行时变量设置为null以清除旧运行。所以我不知道是什么让它慢下来。我一直在使用VisualVM,它说.run()把所有的时间都花在“Self-time”或“Thread.init()”上,这是没有帮助的 一些代码片段: for (int r = 0;
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中查看线程及其状态。要更快获得更好的帮助,您应该尝试创建一个新的。这样,人们将能够测试您的代码,重现问题,并可能发现问题。例如,在不知道新运行时(…)是什么的情况下,很难对您的问题进行推理。我们的想法是从代码中提取一个复制行为的最小可编译示例。为线程设置空值没有多大作用-如果线程仍在运行,它将不会被垃圾收集。“将线程设置为空”是一个有意义的问题