美文网首页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线程池中多线程操作同一变量

    ExecutorService java中在java.util.concurrent包下,提供ExecutorSe...

  • Java基础知识02- 线程

    多线程通信 :什么是多线程通信 ?怎么进行通信 ? 多线程通信就是多个线程同时操作同一个全局变量,但是操作的动作不...

  • Java 线程(3)- 线程共享

    当使用多线程时,当多个线程同时操作同一个变量时,由于竞争条件(race condition)可能破坏该变量的状态,...

  • JAVA 多线程与锁

    JAVA 多线程与锁 线程与线程池 线程安全可能出现的场景 共享变量资源多线程间的操作。 依赖时序的操作。 不同数...

  • Threadlocal-线程隔离的全局变量

    多线程里,多个线程操作同一个全局对象会出现互相干扰的情况,为避免干扰,每个线程会使用局部变量,但是局部变量在单个线...

  • 分布式锁

    1、锁: 单进程的系统中,存在多线程同时操作一个公共变量,此时需要加锁对变量进行同步操作,保证多线程的操作线性执行...

  • 学完了volatile,你又变强了?难怪面试官不敢为难你

    volatile 简介 一般用来修饰共享变量,保证可见性和可以禁止指令重排 多线程操作同一个变量的时候,某一个线程...

  • 多线程(三)——多线程之间通讯

    什么是多线程之间通讯 多线程之间通讯,其实就是多个线程在操作同一个资源,但是操作的动作不同。 多线程之间通讯需求:...

  • 3.多线程之间通讯

    什么是多线程之间通讯? 多线程之间通讯,其实就是多个线程在操作同一个资源,但是操作的动作不同。 多线程之间通讯需求...

  • Java并发编程(二):线程安全

    1 概述 在多线程并发环境下,由于线程之间的执行顺序不可预测,所以如果多个线程对同一共享且可变的变量执行写操作,就...

网友评论

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

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