草庐IT

【JavaEE】线程池

全部标签

java - 我可以设置 Java VM 可用的线程/CPU 数量吗?

我想限制JavaVM可用的线程/进程数,类似于您设置可用内存的方式。我希望能够将其指定为仅使用1个线程或任意数量。注意:我无法在代码中设置它,因为我想限制的代码是一个我无法修改源代码的库。所以这肯定是对虚拟机的级别强加的硬上限。(或者,如果您可以对可以覆盖库的应用程序本身施加线程限制?)注意2:此目的是性能测试,以限制我要测试的库,以查看当它访问不同数量的CPU/线程时它的性能如何。谢谢! 最佳答案 JVM中的CPU限制问题在Java10中得到解决,并从build8u191向后移植到Java8:-XX:ActiveProcessor

java - 守护进程线程数、线程数和总启动线程数

我有一个用Java编写的多线程回显服务器的简单代码(它将接收到的任何内容返回给客户端)。我正在分析服务器的各种资源,包括线程统计信息。以下是根据连接的客户端数量列出的一些统计数据。我的问题是与非基线相比的基线(#ofclients0)!1)为什么当单个客户端连接时,总线程数增加2?(对于其余部分,增加1是有意义的)2)两个非守护线程是什么?!以及为什么守护进程最初增加1然后固定?它们是随机的吗?!#clients012345678910TotalStartedThreadCount1518192021222324252627Threadcount14161718192021222324

java - 按顺序执行任务但从池中获取线程的 ExecutorService

我正在尝试构建ExecutorService的实现,我们称它为SequentialPooledExecutor,具有以下属性。SequentialPooledExecutor的所有实例共享同一个线程池对同一SequentialPooledExecutor实例的调用按顺序执行。换句话说,实例在开始处理其队列中的下一个任务之前等待当前正在执行的任务的终止。我目前正在自己​​实现SequentialPooledExecutor,但我想知道我是否在重新发明轮子。我查看了ExecutorService的不同实现,例如Executors类提供的实现,但没有找到满足我要求的实现。您是否知道我是否缺少

java - 为什么要在单线程方法中放置同步块(synchronized block)?

我偶然发现了thisarticle在IBM-developerworks上,他们发布的代码让我提出了一些问题:为什么局部变量Map的构建包含在synchronizedblock中?请注意,他们隐含地表示只有一个producer线程。实际上,为什么这个片段需要一个synchronizedblock?volatile变量应该足以完成这项工作,因为新创建的map只有在填满后才会发布。锁对象上只有一个线程同步有什么意义?文章提到:ThesynchronizedblockandthevolatilekeywordinListing1arerequiredbecausenohappens-befo

java - 你能推荐一个好的 Java 反病毒组件来与 JavaEE Web 应用程序集成吗?

关闭。这个问题不符合StackOverflowguidelines.它目前不接受答案。要求我们推荐或查找工具、库或最喜欢的场外资源的问题对于StackOverflow来说是偏离主题的,因为它们往往会吸引自以为是的答案和垃圾邮件。相反,describetheproblem以及迄今为止为解决该问题所做的工作。关闭8年前。Improvethisquestion想听听您关于实现防病毒JavaAPI以在将上传的文档/文件存储到数据库之前对其进行扫描的建议。

java - Lucene IndexWriter线程安全

Lucene鼓励从多个线程中重用IndexWriter。假设两个线程可能有一个对IndexWriter的引用,如果线程A调用writer上的close,线程B将留下一个无用的writer。但据我所知,lucene以某种方式知道另一个线程使用同一个编写器并推迟其关闭。真的是这样吗?Lucene如何跟踪另一个线程使用编写器?编辑从答案来看关闭IndexWriter是不正确的。但这带来了一个新问题:如果保持IndexWriter打开,基本上会阻止从另一个JVM访问该索引(例如,在集群的情况下,或许多应用程序之间的共享索引)。 最佳答案 如

java - 我可以从实时 JVM 转储当前线程堆栈变量吗?

我需要查看2个死锁线程的堆栈以分析情况。JVM现在是实时的,数据也在那里,但我需要某种工具来从进程中提取它。我只关心String类型的堆栈中的6个变量。非常感谢任何想法。JVM版本6_35,它是一个linux,启用了JMX,但我没有profiler/在其上配置的调试器连接。很难重现。 最佳答案 我发现了一个使用堆转储查看器的小技巧(在本例中是YourKit,但其他人也可以)。基本上你枚举Thread类的所有实例,然后你通过名称找到你想要的线程并打开它。堆栈变量标记为,如下所示:并不是所有的变量都在这里,但是所有作为参数传递给方法的变

java - 为什么将 GC 限制为 1 个线程会提高性能?

我编写了一些简单的Java代码来人为地使用大量RAM,我发现当我使用这些标志时获得相关时间:1029.59seconds....-Xmx8g-Xms256m696.44seconds.....-XX:ParallelGCThreads=1-Xmx8g-Xms256m247.27seconds.....-XX:ParallelGCThreads=1-XX:+UseConcMarkSweepGC-Xmx8g-Xms256m现在,我明白了为什么-XX:+UseConcMarkSweepGC会提高性能,但是为什么当我限制为单线程GC时我会得到加速?这是我写得不好的Java代码的产物,还是这也适

java - 如何从多个线程记录数据?

大量线程连续并行运行(让我们假设这个连续部分)。所有线程都想记录一些应用程序数据,基本上是一组值。记录这些数据的最佳方法是什么?单个/多个文件?备份此日志的最佳方法是什么?从备份文件中读取数据并将其转换为有用的东西的方法是什么?多个线程,如this和this建议使用log4net和log4j,但我想知道实际过程?还有多个线程如何写入同一个日志文件?每个线程都需要文件级锁吗?这一切是如何运作的?任何有助于理解所有细节的指示都将不胜感激。谢谢。 最佳答案 像log4j这样的库将能够根据您的需要进行配置。拆分成太多文件会使调试某些问题变得

java - 如何避免两个不同的线程从数据库中读取相同的行(Hibernate 和 Oracle 10g)

假设我有两个不同的线程,T1和T2,同时访问同一个数据库并从同一个表中获取数据。现在在线程启动时,我需要从表中获取数据并将行存储到一个集合中,然后我将使用它在其他地方执行一些工作。我不希望两个线程能够处理相同的数据,因为这会导致重复(和长时间)的工作。更具体地说,这是一个企业应用程序,需要在启动时加载一些记录并将其存储在一个集合中以执行一些额外的工作。问题在于,在集群环境中,这可能会导致两个不同的实例加载相同的数据,因此可能会重复工作。所以我希望行仅由单个实例加载一次。我怎样才能避免这种情况?我目前正在使用Hibernate和Oracle10g。这些是我到目前为止的解决方案:以编程方式