mur*_*ngu 8 java multithreading dependency-injection guice
我已经成功创建了一个Guice绑定注释,将单线程java.util.concurrent.ExecutorService实例注入到构造函数中.
这是一个示例用法:
public class ContainsSingleThreadedExecutorService {
private final ExecutorService executorService;
@Inject
public ContainsSingleThreadedExecutorService(@SingleThreaded ExecutorService executorService) {
this.executorService = executorService;
}
}
Run Code Online (Sandbox Code Playgroud)
我现在想为多线程执行程序创建一个类似的注释,在注释中指定ThreadPool大小.例如:
public class ContainsMultiThreadedExecutorService {
private final ExecutorService executorService;
@Inject
public ContainsMultiThreadedExecutorService(@MultiThreaded(poolSize = 5) ExecutorService executorService) {
this.executorService = executorService;
}
}
Run Code Online (Sandbox Code Playgroud)
有没有人知道如何从Guice提供程序访问"poolSize"参数的值?
你不能.这不是打算如何使用绑定注释...该参数仅用于区分ExecutorService
绑定与@MultiThreaded(poolSize = 5)
绑定的绑定@MultiThreaded(poolSize = 2)
.它不是帮助配置a的元数据Provider
.
如果注入带注释的内容@MultiThreaded(poolSize = 5)
,则需要使用注释绑定某些内容@MultiThreaded(poolSize = 5)
.如果您想要更改在所有这些位置使用的池大小,则需要在绑定它的位置和注入它的所有位置更改poolSize = 5
为poolSize = 4
.这对我来说没什么意义.
ExecutorService
您应该根据您想要使用它们的内容来绑定它们,而不是通过它们在线程池中有多少线程来绑定它们.然后,您可以调整每个人在一个地方使用的线程数.
看看NamedImpl
那个工具@Named
和方法Names.named()
。我认为你应该有相同的实施。
更新
Guice 通过 hashCode() 比较注释。因此,如果您不使用,@MultiThreaded(poolSize = 5)
则应该在实例化之前映射它。这似乎是肮脏的解决方法,但你可以这样写 smt
for (int i = 1; i < 20; i++){
bind(ExecutorService.class).annotatedWith(Qualifiers.withValue(i)).toProvider(new DependencyProvider(i));
}
Run Code Online (Sandbox Code Playgroud)
如果你想这样做。请记住,您应该以正确的方式MultiThreadedImpl
覆盖。hashCode
它可能像 smt
@Override
public int hashCode() {
return (127 * "poolSize".hashCode()) ^ value;
}
Run Code Online (Sandbox Code Playgroud)