Fork/Join点点滴滴之一CyclicAction

使用 CyclicAction 来处理循环任务?

CyclicAction 的用法稍微复杂一些。如果一个复杂任务需要几个线程协作完成,并且线程之间需要在某个点等待所有其他线程到达,那么我们就能方便的用 CyclicAction 和 TaskBarrier 来完成。图 2 描述了使用 CyclicAction 和 TaskBarrier 的一个典型场景。        

 

Fork/Join点点滴滴之一CyclicAction
 图 2. 使用 CyclicAction 和 TaskBarrier 执行多线程任务

  继承自 CyclicAction 的子类需要 TaskBarrier 为每个任务设置不同的中止条件。从 CyclicAction 继承的子类需要重载 protected void compute() 方法,定义在 barrier 的每个步骤需要执行的动作。compute() 方法将被反复执行直到 barrier 的 isTerminated() 方法返回 True。TaskBarrier 的行为类似于 CyclicBarrier。

原文例子,仅供参考:

    public class ConcurrentPrint extends RecursiveAction {
	protected void compute() {

        TaskBarrier b = new TaskBarrier() {

            @Override
            protected boolean terminate(int cycle, int registeredParties) {
                System.out.println("Cycle is " + cycle + ";" + registeredParties + " parties");
                return cycle >= 10;
            }
        };

        ForkJoinPool pool = new ForkJoinPool();
        int n = pool.getPoolSize();
        CyclicAction[] actions = new CyclicAction[n];
        for (int i = 0; i < n; ++i) {
            final int index = i;
            actions[i] = new CyclicAction(b) {

                protected void compute() {
                    System.out.println("I'm working " + getCycle() + " " + index);

                    try {
                        Thread.sleep(500);
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                }
            };
        }
        for (int i = 0; i < n; ++i) {
            actions[i].fork();
        }
        for (int i = 0; i < n; ++i) {
            actions[i].join();
        }
    }

    public static void main(String[] args) {
        System.out.println("\ntesting Task Barrier ...");
        RecursiveAction fjt = new ConcurrentPrint();
        ForkJoinPool fjpool = new ForkJoinPool();
        fjpool.submit(fjt);
    }
}

 

无论 http://gee.cs.oswego.edu/dl/jsr166/dist/jsr166ydocs/ 还是http://gee.cs.oswego.edu/dl/jsr166/dist/extra166ydocs/ API文档中都没涉及到CyclicAction类。

难道被CANCEL掉了?继续等待Java 7吧!

 

你可能感兴趣的:(thread,多线程)