Skip to content

16_Join&Fork

本文主要介绍了线程的join和fork方法。

join方法

  • join方法是Thread类的一个方法,用于等待线程结束。
  • join方法的底层是通过wait方法实现的。

fork方法

  • fork方法是ForkJoinPool类的一个方法,用于将任务拆分成多个子任务并行执行。
  • fork方法的底层是通过ForkJoinTask类实现的。

join和fork配合的使用示例

java
public class JoinAndFork {
    public static void main(String[] args) {
        ForkJoinPool forkJoinPool = new ForkJoinPool();
        ForkJoinTask<Integer> task = new ForkJoinTask<Integer>() {
            @Override
            public Integer getRawResult() {
                return null;
            }

            @Override
            protected void setRawResult(Integer value) {
            }

            @Override
            protected boolean exec() {
                if (ThreadLocalRandom.current().nextInt() % 2 == 0) {
                    System.out.println(Thread.currentThread().getName() + " is running.");
                    return true;
                } else {
                    ForkJoinTask<Integer> left = new ForkJoinTask<Integer>() {
                        @Override
                        public Integer getRawResult() {
                            return null;
                        }

                        @Override
                        protected void setRawResult(Integer value) {
                        }

                        @Override
                        protected boolean exec() {
                            System.out.println(Thread.currentThread().getName() + " is running.");
                            return true;
                        }
                    };
                    ForkJoinTask<Integer> right = new ForkJoinTask<Integer>() {
                        @Override
                        public Integer getRawResult() {
                            return null;
                        }

                        @Override
                        protected void setRawResult(Integer value) {
                        }

                        @Override
                        protected boolean exec() {
                            System.out.println(Thread.currentThread().getName() + " is running.");
                            return true;
                        }
                    };
                    left.fork();
                    right.fork();
                    left.join();
                    right.join();
                    return true;
                }
            }
        };
        forkJoinPool.submit(task);
    }
}