java 멀티스레드 Executor

6705 단어 다중 스레드
대량의 데이터를 처리할 때 저는 Executor를 습관적으로 사용해서 한 무더기의 데이터를 여러 개의 라인으로 나누었습니다. 각 라인은 데이터의 격리를 보장하고 각 단원은 서로 독립된 것입니다. 사용 장면: 작업장 처리, 사용자 한도 계산.다음에, 나는 데이터의 최대 값을 예로 삼아 다중 루틴 처리를 하려고 한다.
package com.yxkong.demo.executor;
import java.util.ArrayList;
import java.util.List;
import java.util.Random;
import java.util.concurrent.Callable;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.Future;
import java.util.concurrent.FutureTask;


public class ExecutorThread {
    /**
     *    
     */
    private ExecutorService exec;
    /**
     * cpu   
     */
    private int cpuNum;
    /**
     *           
     */
    private List> tasks = new ArrayList>();

    public ExecutorThread(ExecutorService exec, int cupNum) {
        this.cpuNum = cupNum;
        this.exec = exec;
    }
    /**
     *      
     * @author ducongcong
     * @date 2017 5 21 
     */
    class SumExecutor implements Callable {

        //      
        private List list;
        public SumExecutor(List list) {
            this.list = list;
        }
        public Integer call() throws Exception {
            String threadName = Thread.currentThread().getName();
            Integer maxId = 0;
            //          ,list               ,          
            for(Integer i:list){
                if(maxId" maxId="+maxId);
            return maxId;
        }

    }

    /**
     *  cpu         
     */
    public Integer exeData(List dataTasks) {
        //   CPU        ,  FutureTask    Executor
        SumExecutor subCalc = null;
        FutureTask task = null;
        int size = dataTasks.size();
        for (int i = 0; i < cpuNum; i++) {
            int increment =  size/ cpuNum + 1;
            int start = increment * i;
            int end = increment * i + increment;
            if (end > size)
                end = size;
            //     ,           
            subCalc = new SumExecutor(dataTasks.subList(start, end));
            task = new FutureTask(subCalc);
            tasks.add(task);
            exec.submit(task);
        }
        subCalc = null;
        task = null;
        return getMaxId();
    }
    /**
     *      
     */
    public Integer getMaxId() {
        Integer result = 0;
        for (Future task : tasks) {
            try {
                if (result < task.get()) {
                    result = task.get();
                }
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
        return result;
    }
    private static List genList(int size) {
        List list = new ArrayList();
        for (int i = 0; i <= size; i++) {
            list.add(new Random().nextInt());
        }
        return list;
    }
    public static void main(String[] args) {
        //   executorService      
        int cpuNum = 4;
        ExecutorService executorService = Executors.newFixedThreadPool(cpuNum);
        List arrays = genList(100);
        System.err.println(arrays.toString());
        ExecutorThread executorThread = new ExecutorThread(executorService, 4);
        executorThread.exeData(arrays);
        System.err.println("max:"+ executorThread.getMaxId());

    }
}

좋은 웹페이지 즐겨찾기