[英]Using ExecutorService to process tasks in parallel
我正在編寫一個需要並行監視多台機器的java程序。 此數字不固定,可在程序執行期間隨時變化(增加/減少)。
我在考慮做這樣的事情:
public static void main (String args[]) {
ExecutorService EXEC1 = Executors.newScheduledThreadPool(1);
EXEC1.scheduleWithFixedDelay(new Runnable() {
ExecutorService EXEC2 = Executors.new...
Map<Integer, Future<Void>> monitoringTasks = new HashMap<Integer, Future<Void>>();
@Override
public void run() {
List<Machine> monitorizedMachines = MachineDao.getMonitorizedMachines();
for (Machine machine: monitorizedMachines) {
Future<Void> monitoringTask = monitoringTasks.get(machine.getId());
if(monitoringTask == null || monitoringTask.isDone()) {
monitoringTask = EXEC2.submit(new Runnable() {
@Override
public void run() throws Exception {
// monitor machine....
}
});
monitoringTasks.put(machine.getId(), monitoringTask);
}
}
}
}, 1, 1, TimeUnit.SECONDS);
}
但是我在這種情況下選擇最合適的Executor(EXEC2)時遇到了麻煩:FixedThreadPool,CachedThreadPool,Custom Implementation,...
需要說每個監控任務大約需要2/3秒。
任何人都可以給我任何建議嗎?
大多數情況下,當您開發基於生產的大型應用程序時,需要使用ExecutorService EXEC2 = Executors.newFixedThreadPool(THREAD_COUNT);
並且您需要在執行 具有預期請求/數量的 性能測試后正確配置THREAD_COUNT
。
您可以在此處查看有關為什么newCachedThreadPool()
不適合具有大量請求的應用程序的更多詳細信息。
這是一個簡單的例子。 在您的類中首先添加示例公共變量boolean ISWORKING。 在run()代碼中,在變量之間添加代碼,如下例所示:
public static class Machine implements Runnable {
public boolean ISWORKING = true;
@Override
public void run() {
this.ISWORKING = true;
//YOUR CODE HERE..................
this.ISWORKING = false;
}
}
第二個示例代碼:
Timer timer = null;
TimerTask task = null;
boolean isLocked = false;
public void main() {
task = new TimerTask() {
@Override
public void run() {
if (isLocked) {
return;
}
isLocked = true;
List<Machine> monitorizedMachines = MachineDao.getMonitorizedMachines();
//Count the pending job.
int poolsize = 0;
for (Machine machine : monitorizedMachines) {
if (!machine.ISWORKING) {
poolsize++;
}
}
if (poolsize == 0) {
isLocked = false;
return;
}
//Prevent a lot of poolsize.
poolsize = Math.min(100, poolsize);
ThreadPoolExecutor pool = (ThreadPoolExecutor) Executors.newFixedThreadPool(poolsize);
for (Machine machine : monitorizedMachines) {
if (!machine.ISWORKING) {
pool.execute(machine);
}
}
pool.shutdown();
isLocked = false;
}
};
timer = new Timer();
timer.schedule(task, 1000, 2000);
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.