我有多个可运行的类,我想通过一个集中的类使用执行器服务运行它们(称之为 Launcher 类,其中包含所有可运行的列表)。
我写了一个Launcher
类,它使用所有的 bean 来实例化applicationContext.getBean()
. 每个可运行类还pool size
为它定义一个(为此可运行类产生的线程数)。
public class DaemonsLauncher {
@Autowired
private ApplicationContext appContext;
private List<Daemon> daemons = new ArrayList<Daemon>();
private ScheduledThreadPoolExecutor executor;
private void initThreadPool() throws Exception {
//daemonNames coming at run time from somewhere.
List<String> daemonList = Arrays.asList(daemonNames.split(Constant.COMMA));
//Pool size will now be summation of all the pool sizes.
int poolSize = 0;
for (String dName : daemonList) {
Daemon daemon = appContext.getBean(dName, Daemon.class);
poolSize += daemon.getPoolSize();
daemons.add(daemon);
}
executor = new ScheduledThreadPoolExecutor(poolSize);
}
public void launchDaemons() throws Exception {
for (Daemon daemon : daemons) {
for (int currentThreadCount = 1; currentThreadCount <= daemon.getPoolSize(); currentThreadCount++) {
executor.scheduleWithFixedDelay(daemon, 0, XYZ, ABC);
}
}
}
}
在执行此操作的过程中,我将所有可运行对象添加到一个List<Daemon>
(其中 Daemon 是由其他守护进程扩展的抽象可运行类)。
public abstract class Daemon implements Runnable {
protected int poolSize = 1;
public int getPoolSize() {
return poolSize;
}
@Override
public void run() {
//Calls run methods of individual runnables here.
}
}
如您所见,我在执行时多次添加每个可运行类的相同实例(取决于 poolSize)。
executor
作为一个ScheduledThreadPoolExecutor
.
在调用run 方法的那一刻,R
我两次都找到了相同的可运行类实例,因为它们只被使用一次appContext.getBean()
(通过打印 hasCode 和 toString 进行检查)。
但是这些可运行类的多个实例同时运行。
这种情况可能有什么问题?这些为同一个可运行对象运行的多个线程会导致问题还是会正常运行?
作为替代方案,根据 poolSize,我甚至可以在此循环之前获取 Runnable 类的多个实例,并且根据列表中存在的所有“Runnable”条目仅循环一次。
- 所有 bean 本质上都是原型(尽管它不会出现,因为我只调用了一次 appContext.getBean)。
一个
sample Runnable class
。public class R extends Daemon { @Override public void runIndividualDaemon() { //Called by run of Daemon class. logger.info("Running Daemon." + this.hashCode() + " " + this.toString()); } @Override protected void init() throws Exception { this.poolSize = 5; } }