gpt4 book ai didi

java - ExecutorService 中的持久变量 (Java)

转载 作者:搜寻专家 更新时间:2023-10-31 20:22:54 24 4
gpt4 key购买 nike

我创建了一个包含 4 个工作线程的池来处理一些文件。在测试中,大约有 200 个。线程池版本已经比顺序执行快了大约 3 倍,但还有改进的空间。

最大的瓶颈(忽略磁盘 I/O)是我需要实例化一个新的 MessageDigest 对象。在单线程版本中我只有 1 个。在这个版本中我有 200 个。

我想知道的是,工作池中的线程是否可以有一个局部变量?这样(假设没有线程死亡)将只有四个 MessageDigest 对象实例而不是 200...

每个任务都需要摘要,所以我不确定是否有更好的方法...

更新

我尝试使用 ThreadLocal 对象,但我应该在哪里创建它?如果我在任务本身中创建它,我猜它会在任务完成时脱离上下文。每次创建一个新实例。我的代码是:

    ThreadLocal<GenerateSHA1> tl = new ThreadLocal<GenerateSHA1>();

hashMaker = tl.get();
if(hashMaker == null){
hashMaker = new GenerateSHA1();
tl.set(hashMaker);
}

这是从任务的构造函数内部完成的。

更新

好吧,让它成为静态类型是因为对象不会丢失 - 但它现在突出显示了一个不同的问题。工作“任务”在主线程中创建,然后使用 invokeAll() 添加到 ExecutorService。

关于如何解决这个问题有什么想法吗?

最佳答案

为您的类扩展 ThreadLocal 并覆盖 initialValue() 方法。默认情况下,它返回 null。

private static class ThreadLocalGenerateSHA1 extends
ThreadLocal<GenerateSHA1> {

@Override
protected GenerateSHA1 initialValue() {
return new GenerateSHA1();
}

}

private static final ThreadLocalGenerateSHA1 generateSHA1 = new ThreadLocalGenerateSHA1();

...

在任务上,只需调用generateSHA1 的get() 方法即可。您不需要调用 set()

关于java - ExecutorService 中的持久变量 (Java),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7833926/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com