⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 fjtask.java

📁 一个很好的微工作流内核
💻 JAVA
📖 第 1 页 / 共 2 页
字号:
   * such condition is built-in: join() repeatedly yields until a task   * has terminated after producing some needed results. You can also   * use yield to wait for callbacks from other FJTasks, to wait for   * status flags to be set, and so on. However, in all these cases,   * you should be confident that the condition being waited for will   * occur, essentially always because it is produced by    * a FJTask generated by the current task, or one of its subtasks.   *   * @exception ClassCastException if caller thread is not   * running in a FJTaskRunner thread.   **/  public static void yield() { getFJTaskRunner().taskYield(); }  /**   * Yield until this task isDone.   * Equivalent to <code>while(!isDone()) yield(); </code>   * @exception ClassCastException if caller thread is not   * running in a FJTaskRunner thread.   **/  public void join() { getFJTaskRunner().taskJoin(this);   }  /**   * Immediately execute task t by calling its run method. Has no   * effect if t has already been run or has been cancelled.   * It is equivalent to  calling t.run except that it   * deals with completion status, so should always be used   * instead of directly calling run.   * The method can be useful   * when a computation has been packaged as a FJTask, but you just need to    * directly execute its body from within some other task.   **/  public static void invoke(FJTask t) {    if (!t.isDone()) {       t.run();       t.setDone();    }  }  /**   * Fork both tasks and then wait for their completion. It behaves as:   * <pre>   * task1.fork(); task2.fork(); task2.join(); task1.join();   * </pre>   * As a simple classic example, here is   * a class that computes the Fibonacci function:   * <pre>   * public class Fib extends FJTask {   *    *  // Computes fibonacci(n) = fibonacci(n-1) + fibonacci(n-2);  for n> 1   *  //          fibonacci(0) = 0;    *  //          fibonacci(1) = 1.          *   *  // Value to compute fibonacci function for.   *  // It is replaced with the answer when computed.   *  private volatile int number;   *   *  public Fib(int n) { number = n; }   *   *  public int getAnswer() {   *    if (!isDone()) throw new Error("Not yet computed");   *    return number;   *  }   *   *  public void run() {   *    int n = number;   *    if (n > 1) {   *      Fib f1 = new Fib(n - 1);   *      Fib f2 = new Fib(n - 2);   *   *      coInvoke(f1, f2); // run these in parallel   *   *      // we know f1 and f2 are computed, so just directly access numbers   *      number = f1.number + f2.number;   *    }   *  }   *   *  public static void main(String[] args) { // sample driver   *    try {   *      int groupSize = 2;    // 2 worker threads   *      int num = 35;         // compute fib(35)   *      FJTaskRunnerGroup group = new FJTaskRunnerGroup(groupSize);   *      Fib f = new Fib(num);   *      group.invoke(f);   *      int result = f.getAnswer();   *      System.out.println(" Answer: " + result);   *    }   *    catch (InterruptedException ex) {   *      System.out.println("Interrupted");   *    }   *  }   * }   * </pre>   *   * @exception ClassCastException if caller thread is not    * running in a FJTaskRunner thread.   **/  public static void coInvoke(FJTask task1, FJTask task2) {    getFJTaskRunner().coInvoke(task1, task2);  }  /**   * Fork all tasks in array, and await their completion.   * Behaviorally equivalent to:   * <pre>   * for (int i = 0; i &lt; tasks.length; ++i) tasks[i].fork();   * for (int i = 0; i &lt; tasks.length; ++i) tasks[i].join();   * </pre>   **/  public static void coInvoke(FJTask[] tasks) {    getFJTaskRunner().coInvoke(tasks);  }  /**   * A FJTask that holds a Runnable r, and calls r.run when executed.   * The class is a simple utilty to allow arbitrary Runnables   * to be used as FJTasks.   **/  public static class Wrap extends FJTask {    protected final Runnable runnable;    public Wrap(Runnable r) { runnable = r; }    public void run() { runnable.run(); }  }  /**   * A  <code>new Seq</code>, when executed,   * invokes each task provided in the constructor,  in order.    * The class is a simple utility   * that makes it easier to create composite FJTasks.    **/  public static class Seq extends FJTask {    protected final FJTask[] tasks;    /**     * Construct a Seq that, when executed, will process each of the     * tasks in the tasks array in order     **/    public Seq(FJTask[] tasks) {      this.tasks = tasks;    }    /**      * Two-task constructor, for compatibility with previous release.     **/    public Seq(FJTask task1, FJTask task2) {      this.tasks = new FJTask[] { task1, task2 };    }    public void run() {      for (int i = 0; i < tasks.length; ++i) FJTask.invoke(tasks[i]);    }  }  /**    * Construct and return a FJTask object that, when executed, will   * invoke the tasks in the tasks array in array order   **/  public static FJTask seq(FJTask[] tasks) {     return new Seq(tasks);   }  /**   * A <code>new Par</code>, when executed,   * runs the tasks provided in the constructor in parallel using    * coInvoke(tasks).   * The class is a simple utility   * that makes it easier to create composite FJTasks.    **/  public static class Par extends FJTask {    protected final FJTask[] tasks;    /**     * Construct a Seq that, when executed, will process each of the     * tasks in the tasks array in parallel     **/    public Par(FJTask[] tasks) {      this.tasks = tasks;    }    /**      * Two-task constructor, for compatibility with previous release.     **/    public Par(FJTask task1, FJTask task2) {      this.tasks = new FJTask[] { task1, task2 };    }    public void run() {      FJTask.coInvoke(tasks);    }  }  /**    * Construct and return a FJTask object that, when executed, will   * invoke the tasks in the tasks array in parallel using coInvoke   **/  public static FJTask par(FJTask[] tasks) {    return new Par(tasks);   }  /**   * A  <code>new Seq2(task1, task2)</code>, when executed,   * invokes task1 and then task2, in order.    * The class is a simple utility   * that makes it easier to create composite Tasks.    **/  public static class Seq2 extends FJTask {    protected final FJTask fst;    protected final FJTask snd;    public Seq2(FJTask task1, FJTask task2) {      fst = task1;      snd = task2;    }    public void run() {      FJTask.invoke(fst);      FJTask.invoke(snd);    }  }  /**    * Construct and return a FJTask object that, when executed, will   * invoke task1 and task2, in order   **/  public static FJTask seq(FJTask task1, FJTask task2) {     return new Seq2(task1, task2);   }  /**   * A <code>new Par(task1, task2)</code>, when executed,   * runs task1 and task2 in parallel using coInvoke(task1, task2).   * The class is a simple utility   * that makes it easier to create composite Tasks.    **/  public static class Par2 extends FJTask {    protected final FJTask fst;    protected final FJTask snd;    public Par2(FJTask task1, FJTask task2) {      fst = task1;      snd = task2;    }    public void run() {      FJTask.coInvoke(fst, snd);    }  }  /**    * Construct and return a FJTask object that, when executed, will   * invoke task1 and task2, in parallel   **/  public static FJTask par(FJTask task1, FJTask task2) {    return new Par2(task1, task2);   }}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -