美文网首页Java学习笔记
ExecutorService线程池中多线程操作同一变量

ExecutorService线程池中多线程操作同一变量

作者: 18587a1108f1 | 来源:发表于2017-07-12 22:05 被阅读114次

    ExecutorService

    java中在java.util.concurrent包下,提供ExecutorService对象,可用于创建线程池,用于多线程情境。

    //创建10个线程的线程池
     ExecutorService service = Executors.newFixedThreadPool(10);
    
              service.submit(task1());
              service.submit(task2());
               .....
              service.shutdown();
    

    这里sumbit()方法加入任务task1后,线程池中的任务不会立即执行,而是会先向后执行,一直到线程池满了或者任务全加入后执行到shutdown()。
    shutdown()的意思为不再加入任务,等待当前线程池中的任务执行完成。所以这个时候会再去执行各个线程中的任务,这样的好处是可以避免服务因为某个任务而停止执行,而是把任务先加入执行队列,保证整体的正常顺利执行,再去执行每个任务细节。

    多线程计数

    当需要统计各个线程中某项共通任务的执行次数时,一般需要加锁解锁操作来保证原子性,java中提供了现有的类型来帮助多线程计数,非常方便。
    ** AtomicInteger** 提供set()和addAndSet()等方法,可实现多线程的原子操作

    //在类下声明一个AtomicInteger变量,用于计数
     private static AtomicInteger num = new AtomicInteger();
    
    .....
    
    //写一个初始化方法,用AtomicInteger自带的set方法初始化
    private static void safeInitial(){
            num.set(0);
        }
    
    ...
    
    //多线程的任务task1()中要计数的地方
    ...
      //addAndGet是指add一个值(这里是1),并且得到加后的结果,我们不需结果,就执行即可
      num.addAndGet(1);
    ...
    
    //最后在service.shutdown后输出计数结果(要在线程都执行完输出统计结果)
    ...
    service.shutdown();
     while (true) { //一直循环执行
          if (service.isTerminated()) {//判断service中的线程是否都执行完
                 System.out,println(num);
                  break;
          }
          Thread.sleep(1000); //每隔1s执行一次循环判断,减少资源消耗
      }
    ....
    

    这样我们就完成了多线程中的计数问题,在多线程中合法的操作同一变量完成了计数。

    相关文章

      网友评论

        本文标题:ExecutorService线程池中多线程操作同一变量

        本文链接:https://www.haomeiwen.com/subject/rcsbhxtx.html