在 Java 中运行超过 1K 线程安全吗?
Is it safe to run more than 1K threads in java?
我正在制作一个试图获得所有可能结果的程序。程序中的线程会生成更多的线程(一千多一点)。我真的不擅长多线程,我担心线程的生成不会停止。我正在使用具有终止按钮的 eclipse IDE,这会停止所有正在运行的线程吗?如果没有,还有其他方法吗? JVM 可以处理这个吗?
是的。在 eclipse 启动的 JVM 中单击终止按钮将停止该 JVM,这将停止所有 运行ning 线程(就像终止 JVM 进程一样)。
至于 运行 设置一千个线程,我不推荐它...这听起来像一个非常慢的方法(因为每个线程最多只能 运行 ~[= n
CPU 个核心上的 15=]。
实际上,Java编程语言并没有限制打开1000个或更多的线程。但是,问题是它会减慢工作速度。
你知道线程是如何工作的吗? Thread 只是在 OS 的帮助下创建一个环境,以便应用程序用户可以感觉到程序是 运行ning 并行的。但是,实际情况是不同的。具有单核处理器的计算机可以在瞬间处理一个操作。我们的OS只是一个接一个地发送操作,这样我们用户就可以感觉到它们是运行并发的。
例如,让我们考虑一个三线程应用程序。它的每个线程都有一个for循环。第一个线程在循环内添加数字并将结果保存在名为 result1 的变量中,第二个线程在循环内将数字相乘并将结果保存在名为 result2 的变量中,第三个线程在循环内减去数字并将结果保存在名为 result2 的变量中结果3。
现在,如果所有这些线程都在同一时刻启动并让所有线程具有相同的优先级,那么 OS 将一个接一个地发送指令。如果可以发送一个数字与result1相加。在下一瞬间,它可以发送一个数字与 result2 相乘。在下一瞬间,它可以发送一个数字与 result3 相减。在下一瞬间,它可以再次添加。
也就是说,实际上一个单核处理器不能同时进行三个计算。它计算一个计算并暂停其余的计算并以这种方式进行。
我想,现在你明白为什么 运行宁 1000 线程会减慢整个过程。如果上述任务中的性能不是问题,您只需要输出即可 运行 1000+ 线程。
但是,如果您需要提高性能,则必须考虑其他事情。你是否对 Map Reduce? Implementing map reduce by Hadoop 框架感到吃力,你可以在这些类型的问题上获得更好的性能。但是,首先您必须在 map reduce 框架中设计您的问题。这个框架将在多台计算机的帮助下并行计算你的任务。
另一种解决方法是设置优先级。在 java 中,您可以在 thread.You 中设置优先级,可以为关键任务提供比简单任务更高的优先级。如果你的问题的任务可以区分高优先级和低优先级任务,那肯定会使性能更好。
我正在制作一个试图获得所有可能结果的程序。程序中的线程会生成更多的线程(一千多一点)。我真的不擅长多线程,我担心线程的生成不会停止。我正在使用具有终止按钮的 eclipse IDE,这会停止所有正在运行的线程吗?如果没有,还有其他方法吗? JVM 可以处理这个吗?
是的。在 eclipse 启动的 JVM 中单击终止按钮将停止该 JVM,这将停止所有 运行ning 线程(就像终止 JVM 进程一样)。
至于 运行 设置一千个线程,我不推荐它...这听起来像一个非常慢的方法(因为每个线程最多只能 运行 ~[= n
CPU 个核心上的 15=]。
实际上,Java编程语言并没有限制打开1000个或更多的线程。但是,问题是它会减慢工作速度。
你知道线程是如何工作的吗? Thread 只是在 OS 的帮助下创建一个环境,以便应用程序用户可以感觉到程序是 运行ning 并行的。但是,实际情况是不同的。具有单核处理器的计算机可以在瞬间处理一个操作。我们的OS只是一个接一个地发送操作,这样我们用户就可以感觉到它们是运行并发的。
例如,让我们考虑一个三线程应用程序。它的每个线程都有一个for循环。第一个线程在循环内添加数字并将结果保存在名为 result1 的变量中,第二个线程在循环内将数字相乘并将结果保存在名为 result2 的变量中,第三个线程在循环内减去数字并将结果保存在名为 result2 的变量中结果3。
现在,如果所有这些线程都在同一时刻启动并让所有线程具有相同的优先级,那么 OS 将一个接一个地发送指令。如果可以发送一个数字与result1相加。在下一瞬间,它可以发送一个数字与 result2 相乘。在下一瞬间,它可以发送一个数字与 result3 相减。在下一瞬间,它可以再次添加。
也就是说,实际上一个单核处理器不能同时进行三个计算。它计算一个计算并暂停其余的计算并以这种方式进行。
我想,现在你明白为什么 运行宁 1000 线程会减慢整个过程。如果上述任务中的性能不是问题,您只需要输出即可 运行 1000+ 线程。
但是,如果您需要提高性能,则必须考虑其他事情。你是否对 Map Reduce? Implementing map reduce by Hadoop 框架感到吃力,你可以在这些类型的问题上获得更好的性能。但是,首先您必须在 map reduce 框架中设计您的问题。这个框架将在多台计算机的帮助下并行计算你的任务。
另一种解决方法是设置优先级。在 java 中,您可以在 thread.You 中设置优先级,可以为关键任务提供比简单任务更高的优先级。如果你的问题的任务可以区分高优先级和低优先级任务,那肯定会使性能更好。