在java中运行超过1K的线程是否安全?

时间:2015-01-02 07:11:28

标签: java eclipse multithreading

我正在制作一个试图获得所有可能结果的程序。程序中的线程生成更多线程(略多于一千)。我在多线程方面非常糟糕,我担心线程的产生不会停止。我正在使用具有终止按钮的eclipse IDE,这将停止所有正在运行的线程,如果没有其他方法吗? JVM可以处理这个吗?

2 个答案:

答案 0 :(得分:6)

是。单击eclipse中的终止按钮启动JVM将停止该JVM,这将停止所有正在运行的线程(就像杀死JVM进程一样)。

至于运行一千个线程,我不推荐它...这听起来像一个非常慢的方法(因为每个线程只能在n CPU上运行最多~n / 1000次芯)。

答案 1 :(得分:1)

实际上,在Java编程语言中打开1000个或更多线程没有任何限制。然而,问题是它会减慢工作速度。

你知道线程是如何工作的吗?线程只是在操作系统的帮助下创建一个环境,以便应用程序用户可以感觉到程序是并行运行的。但是,实际情况是不同的。具有单核处理器的计算机可以立即处理一个操作。我们的操作系统只是一个接一个地发送操作,这样我们用户就可以感觉到它们是并行运行的。

例如,让我们考虑一个三线程应用程序。它的每个线程都有一个for循环。第一个线程在循环中添加数字并将结果保存在名为result1的变量中,第二个线程将数字与循环内的数字相乘并将结果保存在名为result2的变量中,第三个线程在循环内减去数字并将结果保存在名为result1的变量中result3。

现在,如果所有这些线程都在同一时刻启动并且所有线程都具有相同的优先级,那么操作系统将一个接一个地发送指令。如果可以发送一个数字来添加result1。在下一个瞬间,它可以发送一个数字与result2相乘。在下一个瞬间,它可以发送一个数字与result3相减。在下一个瞬间,它可以再次添加。

这意味着,实际上单个核心处理器无法同时计算三个计算。它计算一个计算并使其余的计算暂停,并以这种方式进行。

我认为,现在你明白为什么运行1000个线程会减慢整个过程。如果性能在上述任务中没有问题,而您只需要输出就可以运行1000+线程。

但是,如果你需要提高性能,你必须考虑别的事情。你对Map Reduce有所了解吗?通过Hadoop框架实现map reduce,您可以在这些类型的问题中获得更好的性能。但是,首先你必须在map reduce frame中设计你的问题。此框架将在多台计算机的帮助下并行计算您的任务。

另一种解决方案是设置优先级。在java中,您可以在线程中设置优先级。您可以为关键任务提供比简单任务更高的优先级。如果您的问题的任务可以通过高优先级和低优先级任务来区分,那么它将使性能更好。