本人小白  对多线程这块 不是很理解  
现在有一个集合  集合里面就十条企业数据  我需要用多线程处理 这个十个数据  来跑一个规则引擎 跑这个方法的参数就是一条企业数据  
我怎么用多线程 用十个线程  让每个线程跑一条数据  同时进行  求大神 啊  给写个小demo  或者有相似的案例  跪求!!!

解决方案 »

  1.   

    利用Callable实现public void dealListWithMutiThread(){
            List<Object> list = new ArrayList<Object>(10000);
            int index = 0;
            ExecutorService ex = Executors.newFixedThreadPool(5);
            int dealSize = 2000;
            List<Future<List<Object>>> futures = new ArrayList<>(5);
                    //分配
            for(int i=0;i<5;i++,index+=dealSize){
                int start = index;
                if(start>=list.size()) break;
                int end = start + dealSize;
                end = end>list.size() ? list.size() : end;
                futures.add(ex.submit(new Task(list,start,end)));
            }
            try {
                //处理
                List<Object>  result = new ArrayList<>();
                for(Future<List<Object>> future : futures){
                    //合并操作
                    result.addAll(future.get());
                }
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
         
        private class Task implements Callable<List<Object>>{
             
            private List<Object> list;
            private int start;
            private int end;
             
            public Task(List<Object> list,int start,int end){
                this.list = list;
                this.start = start;
                this.end = end;
            }
     
            @Override
            public List<Object> call() throws Exception {
                Object obj = null;
                List<Object> retList = new ArrayList<Object>();
                for(int i=start;i<end;i++){
                    obj = list.get(i);
                    //你的处理逻辑
                }
                //返回处理结果
                return retList;
            }
        }
      

  2.   


    public class Test {
    public static void main(String[] args) throws InterruptedException, ExecutionException {
    // ForkJoinPool pool = new ForkJoinPool();
    List<String> entList = new ArrayList<>();
    entList.add("A61B4A66D95D4680AAB57EFBA4EF6460");
    entList.add("C2AE7888553348B6A783A8F516EFF83D");
    entList.add("DA27C8F9A2B64B6B8939E4619CF2CD81");
    entList.add("5273FFC7233A49F5A065271A1A5F6A0F");
    entList.add("9E9CD32BC841498DAA15E56197235B67");
    entList.add("7A2564018D4B45C4899CF31F0FB67554");
    entList.add("D3D267CCAE4942BEB7F6047D56217D79");
    entList.add("1E3AF2A33C154943A40058B2C8EDF6A6");
    entList.add("D0BBF3F1EC9143EA95A0547131E5985B");
    entList.add("15A1983C7ECE477ABDB72A890D937B11"); int index = 0;
    ExecutorService ex = Executors.newFixedThreadPool(10);
    int dealSize = 1;
    List<Future<List<ValidateMsg>>> futures = new ArrayList<>(); for (int i = 0; i < 10; i++, index += dealSize) {
    int start = index;
    if (start >= entList.size()) {
    break;
    }
    int end = start + dealSize;
    end = end > entList.size() ? entList.size() : end;
    futures.add(ex.submit(new MyTask(entList, start, end)));
    }
    ex.shutdown();
    // List<Object>  result = new ArrayList<>();
    for (Future<List<ValidateMsg>> future : futures) {
    List<ValidateMsg> list = future.get();
    for (int i = 0; i < list.size(); i++) {
    ValidateMsg validateMsg = list.get(i);
    System.out.println(validateMsg.getRuleMsg());
    }
    } }
    }
    public class MyTask implements Callable<List<ValidateMsg>> { private List<String> entList;
    private int start;
    private int end; public MyTask(List<String> entList, int start, int end) {
    this.entList = entList;
    this.start = start;
    this.end = end;
    } @Override
    public List<ValidateMsg> call() throws Exception {
    String entId = null;
    List<ValidateMsg> retList = new ArrayList<>();
    for (int i = start; i < end; i++) {
    entId = entList.get(i);
    Map<String, Object> params = new HashMap<String, Object>();
    params.put("entId", entId);
    ValidateMsg runApp = RuleUtil.runApp("regitem", params);
    // String result = runApp.getResult();
    // System.out.println(result);
    retList.add(runApp);
    }
    return retList;
    }}
      

  3.   

    先用这个生成一个线程池
    BlockingQueue<Runnable> queue = new LinkedBlockingQueue<Runnable>();
    ThreadPoolExecutor executor = new ThreadPoolExecutor(8, 8, 3, TimeUnit.SECONDS, queue, new ThreadPoolExecutor.DiscardPolicy());然后建立一个处理数据的类,比如:
    public class Handle implements Runnable然后这样去执行就OK啦,简单
    Handle handle = new Handle()
    executor.execute(thread);