簡體   English   中英

使用ExecutorService並行處理任務

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM