Skip to content

ForkJoinPool/多线程任务调度处理: 并行任务,串行任务分发

Notifications You must be signed in to change notification settings

yifocus/processor

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

7 Commits
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

processor

使用ForkJoin 实现多线程任务调度处理

我们通常会遇见这种情况需要 并行 串行任务按顺序处理

###如图执行顺序如下

  • 任务一 任务二 异步执行
  • 执行任务三
  • 执行任务四
  • 任务五,任务六,任务七异步执行

###IProcessor 任务需实现的接口

 /**
     * 任务id
     * @return
     */
    public String id();

    /**
     * 是否是异步
     * @return true 异步,false 同步
     */
    public boolean isAsyn();

    /**
     * 任务逻辑处理
     * @return
     */
    public Object process();

###ProcessorExecuteService 逻辑服务

···

/**
 * 任务执行: 此方法完成之后,所有任务都已经调用完成
 * @return
 */
public void execute(){
    ForkJoinPool pool = new ForkJoinPool();
    pool.invoke(new ProcessorAction(chain));
}

/**
 * 异步执行任务
 */
public Future executeAsync(){
    ForkJoinPool pool = new ForkJoinPool();
    future = pool.submit(new ProcessorAction(chain));
    return future;
}

···

###使用多线程调度测试



        Test t = new Test();
        List<IProcessor> list = new CopyOnWriteArrayList<>();
        list.add(new Process1("任务一",true));
        list.add(new Process1("任务二",true));
        list.add(new Process1("任务三",false));
        list.add(new Process1("任务四",false));
        list.add(new Process1("任务五",true));
        list.add(new Process1("任务六",true));
        list.add(new Process1("任务七",true));


        long start = System.currentTimeMillis();
        ProcessorExecuteService processorPool = new ProcessorExecuteService(list);
        processorPool.executeAsync();

        System.out.println("end execute: " + (System.currentTimeMillis() - start));

        System.out.println(processorPool.getProcessorResult("任务一"));
        System.out.println(processorPool.getProcessorResult("任务二"));
        System.out.println(processorPool.getProcessorResult("任务三"));
        System.out.println(processorPool.getProcessorResult("任务四"));
        System.out.println(processorPool.getProcessorResult("任务五"));
        System.out.println(processorPool.getProcessorResult("任务六"));
        System.out.println(processorPool.getProcessorResult("任务七"));

        System.out.println("end get : " + (System.currentTimeMillis() - start));

About

ForkJoinPool/多线程任务调度处理: 并行任务,串行任务分发

Topics

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published

Languages