我已经成功创建了一个Guice绑定注释,将单线程java.util.concurrent.ExecutorService实例注入到构造函数中。
这是一个示例用法:
public class ContainsSingleThreadedExecutorService {
private final ExecutorService executorService;
@Inject
public ContainsSingleThreadedExecutorService(@SingleThreaded ExecutorService executorService) {
this.executorService = executorService;
}
}
我现在想为多线程执行程序创建一个类似的注释,在注释中指定ThreadPool大小。例如:
public class ContainsMultiThreadedExecutorService {
private final ExecutorService executorService;
@Inject
public ContainsMultiThreadedExecutorService(@MultiThreaded(poolSize = 5) ExecutorService executorService) {
this.executorService = executorService;
}
}
有没有人知道如何从Guice Provider访问“poolSize”参数的值?
答案 0 :(得分:7)
你做不到。这不是如何使用绑定注释...该参数仅用于区分与ExecutorService
绑定的@MultiThreaded(poolSize = 5)
与绑定@MultiThreaded(poolSize = 2)
的绑定。这不是帮助配置Provider
的元数据。
如果您注入了使用@MultiThreaded(poolSize = 5)
注释的内容,则需要使用注释@MultiThreaded(poolSize = 5)
绑定某些内容。如果您想要更改在所有这些地方使用的池大小,则需要在绑定它的位置和所有位置更改poolSize = 5
到poolSize = 4
注入它。这对我来说没什么意义。
不是根据它们在线程池中有多少个线程来绑定ExecutorService
,而是应该根据你想要使用它们的方式绑定它们。然后你可以在一个地方调整每个人使用的线程数。
答案 1 :(得分:2)
查看实施NamedImpl
和方法@Named
的{{1}}。我认为你应该有相同的实现。
<强>已更新强>
吉斯
通过hashCode()比较注释。所以,如果你不使用Names.named()
,你应该在实例化之前映射它。这似乎是一种肮脏的解决方法,但你可以写像smt一样
@MultiThreaded(poolSize = 5)
如果你想这样做。请注意,您的 for (int i = 1; i < 20; i++){
bind(ExecutorService.class).annotatedWith(Qualifiers.withValue(i)).toProvider(new DependencyProvider(i));
}
应该以适当的方式覆盖MultiThreadedImpl
。它可能像smt一样
hashCode
答案 2 :(得分:2)
你可以用Guice做这种事情(我曾经几乎完成了这一点),但是Guice真的需要事先了解它的约束力。所以你需要做类似的事情:
for (int i=1; i < 100; i++) {
ExecutorService svc = Executors.newFixedThreadPool(i);
bind (ExecutorService.class).annotatedWith(new MultiThreadedImpl(i)).toInstance(svc);
}
(或者更有可能,绑定到懒惰地初始化它的提供商)。
这很丑陋,你可能实际上并不想这样做。使用@Named并拥有一些ExecutorService实例更有用,这些实例与他们适合的特定事物的名称相关联 - 然后你可以配置在一个地方使用多少线程,而不是不得不怀疑“有人使用73线程的ExecutorService吗?”
答案 3 :(得分:1)
是的,你可以。没有迭代所有情况。
实际上,我有类似你的问题。 Here是我的答案和问题,包括我的所有代码。 我只知道如何处理字段而不是参数,但我认为这不是一个大问题,对吧?
在wiki中关注CustomInjections,您就会知道如何。