是否可以配置ForkJoinpool
使用1个执行线程?
我正在执行在ForkJoinPool
中调用Random
的代码。每次它运行时,我都会遇到不同的运行时行为,这使得研究回归变得很困难。
我希望代码库提供“调试”和“发布”模式。“调试”模式将使用固定种子配置Random
,并使用单个执行线程配置ForkJoinPool
。“释放”模式将使用系统提供的Random
种子,并使用默认数量的ForkJoinPool
线程。
我尝试配置ForkJoinpool
的并行性为1,但它使用2个线程(main
和第二个工作线程)。有什么想法吗?
主线程始终是应用程序将创建的第一个线程。因此,当您创建具有1
的并行性
的ForkJoinpool
时,您正在创建另一个线程。实际上,应用程序中现在将有两个线程(因为您创建了线程的池
)。
如果您只需要一个主线程,您可以按顺序执行代码(而不是并行执行)。
所以,结果证明我错了。
当您配置将并行性设置为1的ForkJoinpool
时,只有一个线程执行任务。主线程在ForkJoin.get()上被阻塞。它实际上不执行任何任务。
也就是说,事实证明,提供确定性行为确实很棘手。以下是我必须纠正的一些问题:
ForkJoinpool
如果工作线程空闲足够长,则使用不同的工作线程(具有不同的名称)执行任务。例如,如果主线程在调试断点上挂起,则工作线程将变为空闲并关闭。当我要恢复执行时,ForkJoinThread
将旋转一个新的工作线程,其名称不同。为了解决这个问题,我必须提供一个自定义的ForkJoinWorkerThreadFactory
实现,如果ForkJoinpool
已经有一个活动的工作人员(这防止池创建多个工作人员),则返回null
。我还必须确保我的代码返回相同的Random
实例,即使一个工作线程关闭并再次返回。 HashMap
或HashSet
)的集合导致元素在每次运行时以不同的顺序抓取随机数。我通过使用LinkedHashMap
和LinkedHashSet
纠正了这一点。 Enum.hashCode()
。我忘记了这导致了什么问题,但我通过自己计算hashCode()来纠正它,而不是依赖于内置的方法。以下是ForkJoinWorkerThreadFactory的示例实现:
class MyForkJoinWorkerThread extends ForkJoinWorkerThread
{
MyForkJoinWorkerThread(ForkJoinPool pool)
{
super(pool);
// Change thread name after ForkJoinPool.registerWorker() does the same
setName("DETERMINISTIC_WORKER");
}
}
ForkJoinWorkerThreadFactory factory = new ForkJoinWorkerThreadFactory()
{
private WeakReference<Thread> currentWorker = new WeakReference<>(null);
@Override
public synchronized ForkJoinWorkerThread newThread(ForkJoinPool pool)
{
// If the pool already has a live thread, wait for it to shut down.
Thread thread = currentWorker.get();
if (thread != null && thread.isAlive())
{
try
{
thread.join();
}
catch (InterruptedException e)
{
log.error("", e);
}
}
ForkJoinWorkerThread result = new MyForkJoinWorkerThread(pool);
currentWorker = new WeakReference<>(result);
return result;
}
};
API1.7和SLF4J-实现简单。我只是找不到如何用这种组合配置日志级别。 有人能帮忙吗?
我想同时向一个webservice发送webservice调用。最多应有20个并行请求等待webservice响应。任何其他请求都应该等待它们完成。 如果一个用户向我发送一个请求,这通常会导致向目标服务器发送5个并行请求。因此,我一次最多可以服务20/5=4个用户。其他人将不得不等待,这很好。或者被高负荷拒绝。 问题:我应该使用哪个线程池,以及如何配置它? 我读了上面的内容如下:主池可以向网络服务
我想知道我的 CORBA 服务器可以同时处理多少个客户端请求: < li >服务器是否为每个新的客户端请求创建一个新的线程? < li >有线程池吗? < li >默认线程池大小是多少? < li >如果达到最大尺寸会怎么样?新线程在队列中等待吗? < li >池中非活动线程(已用于客户端的线程)的空闲时间是多少? < li >我们能否配置这些参数(池大小 我做了很多研究,但我没有找到太阳/甲骨文
问题内容: 我对Javascript的单线程性质有疑问。 此代码的结果是。如您所见,这之后让我感到奇怪的是,在单线程环境中是否应该不应该这样做?如果没有,那么JS怎么知道第二个应该在第一个之前完成?难道不应该有两个线程可以同时工作以完成两个s以便进行通知吗? 问题答案: JavaScript(在浏览器中) 不能 同时运行2。 最多 一个 的的回调可以同时执行-因为有 一个 JavaScript执行
下面是如何通过配置单元JDBC运行查询的 从纱线URL,找不到应用程序ID。
我注意到一些web框架(如Play Framework)允许您配置多个不同大小的线程池(线程池中的线程数)。假设我们在单核的单机中运行这个游戏。拥有多个线程池不会有很大的开销吗?