• Java多线程的实现方式


    继承Thread ,实现Runnable, 实现Callable

    callable有返回值

    Thread

    public class Test1_Thread {
      public static void main(String[] args) {
          new Test1_thread().start();
          System.out.println("任务1已启动  ");
    
          new Test1_thread().start();
          System.out.println("任务2已启动  ");
      }
    
      static class Test1_thread extends Thread {
        @Override
        public void run() {
          for (int j = 0; j < 5; j++) {
            Autil.w1s(1);
            Autil.printCurrent(j);
          }
        }
      }
    }

    Runnable

    public class Test2_Runnable {
        public static void main(String[] args) {
            new Thread(new Test2_myRunnable()).start();
            System.out.println("任务1已启动  ");
    
            new Thread(new Test2_myRunnable()).start();
            System.out.println("任务2已启动  ");
        }
    
        static class Test2_myRunnable implements Runnable {
            @Override
            public void run() {
                for (int j = 0; j < 5; j++) {
                    Autil.w1s(1);
                    Autil.printCurrent(j);
                }
            }
        }
    }

    Callable

    public class Test3_Callable {
    
        /**
         * 需要将任务交给线程池
         */
        public static void main(String[] args) throws Exception {
            // 1. 创建线程池
            ExecutorService pool = Executors.newCachedThreadPool();
            // 2. 向线程池提交任务
            Future<Integer> future1 = pool.submit(new Test3_myCallable());
            System.out.println("任务1已提交  ");
    
            // 3. 获取线程的返回值
            System.out.println("------------------开始查询所有子线程的返回值   ");
            // --3.1 获取方式一: 阻塞方式等待返回值
            // Integer j = future1.get();
    
            int flag = 10;
    
            // --3.2 获取方式二,不停的询问线程任务是否执行完成了
            while (10 == flag) {
                if (future1.isDone()) {
                    flag = 6;
                    System.out.println(" ");
                    System.out.println(flag + "返回值为  " + future1.get());
                } else {
                    System.out.print("任务尚未完成 ");
                    Thread.sleep(50);
                }
            }
    
            // 线程池运行结束后关闭
            pool.shutdown();
            System.out.println("运行结束  " + Thread.activeCount());
        }
    
        static class Test3_myCallable implements Callable<Integer> {
    
            @Override
            public Integer call() throws Exception {
                Autil.w1s(1);
                Autil.printCurrentTimes(3);
                return 33;
            }
        }
    
    }
    


    jdk1.7: fork_join

    import java.util.concurrent.ForkJoinPool;
    import java.util.concurrent.ForkJoinTask;
    import java.util.concurrent.RecursiveTask;
    
    /**
     * 当工作量大时,对任务进行水平拆分。
     */
    public class Test9_fork {
        public static void main(String[] args) throws Exception {
            ForkJoinPool fjp = new ForkJoinPool();
    
            Sum sum = new Sum(1, 1_0);
            ForkJoinTask<Long> task = fjp.submit(sum);
            System.out.println("提交完毕");
    
            Long result = task.get();
            System.out.println("输出结果" + result);
    
        }
    
        static class Sum extends RecursiveTask<Long> {
            private final long from;
            private final long to;
    
            Sum(long from, long to) {
                this.from = from;
                this.to = to;
            }
    
            static boolean tooBiger(long from, long to) {
                return (to - from) > 3 ? true : false;
            }
    
            static long sum(long from, long to) {
                long sum = 0;
                for (; from < to; from++) {
                    sum += from;
                }
                return sum;
            }
    
            @Override
            protected Long compute() {
                if (tooBiger(from, to)) {
                    // 任务量太大
                    long middle = (to + from) / 2;
                    Sum sum1 = new Sum(from, middle);
                    Sum sum2 = new Sum(middle, to);
    
                    sum1.fork();
                    sum2.fork();
                    long sum = 0;
                    sum = sum1.join() + sum2.join();
    
                    System.out.println(sum + "  " + from + " > " + middle + " > " + to);
                    return sum;
                } else {
                    long sum = sum(from, to);
                    System.out.println(sum + " == " + from + " > " + to);
                    return sum;
                }
    
            }
    
        }
    }
    


    代码地址 : https://github.com/fluffywar/Demo/tree/master/concurrency/test1_thread/src/test/java/com/example/demo1

  • 相关阅读:
    Spring框架概念
    git stash 用法总结和注意点
    Java虚拟机:对象创建过程与类加载机制、双亲委派模型
    办公软件技巧
    Zookeeper到底是干嘛的
    ANdroid Studio下载
    node.js网络(net)
    显示日期
    打包apk

  • 原文地址:https://www.cnblogs.com/fluffy/p/6955759.html
Copyright © 2020-2023  润新知