Java Concurrent

Java Concurrent

ExecutorService

  • ExecutorService exec = Executors.newCachedThreadPool(); // create a cached pool
  • ExecutorService exec = Executors.newFixedThreadPool(4); // fixed sized thread pool
  • ExecutorService exec = Executors.newSingleThreadExecutor(); // single thread‘s pool

ThreadPoolExecutor

ThreadPoolExecutor threadPoolExecutor = new ThreadPoolExecutor(3, 6, 2, TimeUnit.HOURS, queue);

  • 3, corePoolSize
  • 6, maximunPoolSize
  • 2, keep alive time (idle threads will be gc after such a long time)
  • TimeUnit.HOURS, time units
  • queue, LinkedBlockingQueue<Runnable>, or new ArrayBlockingQueue<Runnable>(8)

当新任务在方法 execute(java.lang.Runnable) 中提交时,如果运行的线程少于 corePoolSize,则创建新线程来处理请求(即使存在空闲线程)。如果运行的线程多于 corePoolSize 而少于 maximumPoolSize,则仅当队列(queue)满时才创建新线程。如果设置的 corePoolSize 和 maximumPoolSize 相同,则创建了固定大小的线程池。如果将 maximumPoolSize 设置为基本的无界值(如 Integer.MAX_VALUE),则允许池适应任意数量的并发任务。

# AtomicInteger

  • AtomicInteger ac = new AtomicInteger();
  • int index = ac.incrementAndGet();

CountDownLatch

  • countDown(); // decrease the count by 1
  • await(); // suspend the current thread until the count becomes 0
  • CountDownLatch c1 = new CountDownLatch(2); // like the condition in OS

Runnable VS Callable

Runnable和Callable的区别是,

(1)Callable规定的方法是call(),Runnable规定的方法是run().

(2)Callable的任务执行后可返回值,而Runnable的任务是不能返回值得

(3)call方法可以抛出异常,run方法不可以

(4)运行Callable任务可以拿到一个Future对象,表示异步计算的结果。它提供了检查计算是否完成的方法,以等待计算的完成,并检索计算的结果。通过Future对象可以了解任务执行情况,可取消任务的执行,还可获取执行结果。

Semaphore

  • Semaphore s = new Semaphore(4); // allow at most 4 threads concurrently access a piece of code
  • s.acquire() ; // try to get the qualification to access a piece of code, wait if the current semaphore is 0
  • s.release(); // release the lock/semaphore

版权声明:本文为博主原创文章,未经博主允许不得转载。

时间: 2024-10-29 19:13:32

Java Concurrent的相关文章

Java Concurrent happens-before

happens-before relation on memory operations such as reads and writes of shared variables. The results of a write by one thread are guaranteed to be visible to a read by another thread only if the write operation happens-before the read operation. Th

java concurrent之ReentrantLock

在编码的过程中,有时候我们不得不借助锁同步来保证线程安全.synchronized关键字在上一篇博客中已经介绍:自从JDK5开始,添加了另一种锁机制:ReentrantLock. 二者的区别 1.lock是jdk5之后代码层面实现的,synchronized是JVM层面实现的. 2.synchronized在出现异常的时候能够自动释放锁,而lock必须在finally块中unlock()主动释放锁,否则会死锁. 3.在竞争不激烈的时候synchronized的性能是比lock好一点的,但是当竞争

java concurrent之前戏synchronized

对于多线程共享资源的情况需要进行同步,以避免一个线程的改动被另一个线程的改动所覆盖.最普遍的同步方式就是synchronized.把代码声明为synchronized,有两个重要后果,通常是指该代码具有 原子性(atomicity)和 可见性(visibility). 1.原子性强调的是执行,意味着个时刻,只有一个线程能够执行一段代码,这段代码通过一个monitor object保护.从而防止多个线程在更新共享状态时相互冲突. 2.可见性强调的是结果,它要对付内存缓存和编译器优化的各种反常行为.

How to Create a Java Concurrent Program

In this Document   Goal   Solution   Overview   Steps in writing Java Concurrent Program   Template Program:   Program Logic   Program Parameters   Database Operations   Setting request Completion Status   Register executable   Register Concurrent Pr

Java Concurrent之 AbstractQueuedSynchronizer

ReentrantLock/CountDownLatch/Semaphore/FutureTask/ThreadPoolExecutor的源码中都会包含一个静态的内部类Sync,它继承了AbstractQueuedSynchronizer这个抽象类. AbstractQueuedSynchronizer是java.util.concurrent包中的核心组件之一,为并发包中的其他synchronizers提供了一组公共的基础设施. AQS会对进行acquire而被阻塞的线程进行管理,其管理方式是

[Java Concurrent] 并发访问共享资源的简单案例

EvenGenerator 是一个偶数生成器,每调用一个 next() 就会加 2 并返回叠加后结果.在本案例中,充当被共享的资源. EvenChecker 实现了 Runnable 接口,可以启动新的线程执行 run() 任务,用于检测所指向的偶数生成器是否每次都返回偶数值. EvenCheckerThreadDemo 用于演示多线程下的执行情况. 非线性安全版本 EvenGenerator, 偶数生成器,每调用一个 next() 就会加 2 并返回叠加后结果. 这里的 next() 方法并非

java concurrent包的实现原理

由于java的CAS同时具有 volatile 读和volatile写的内存语义,因此Java线程之间的通信现在有了下面四种方式: A线程写volatile变量,随后B线程读这个volatile变量. A线程写volatile变量,随后B线程用CAS更新这个volatile变量. A线程用CAS更新一个volatile变量,随后B线程用CAS更新这个volatile变量. A线程用CAS更新一个volatile变量,随后B线程读这个volatile变量. Java的CAS会使用现代处理器上提供的

利用java concurrent 包实现日志写数据库的并发处理

一.概述 在很多系统中,往往需要将各种操作写入数据库(比如客户端发起的操作). 最简单的做法是,封装一个公共的写日志的api,各个操作中调用该api完成自己操作日志的入库.但因为入数据库效率比较低,如果每个操作自己入库,则会影响响应速度.而且当操作并发度很高时,往往同时有多个线程在写数据库,也会对系统有影响. 考虑的解决方案是,这个api并不实际完成入库,而是将每个操作日志信息写到一个公共的缓存中,然后应用系统起了一个独立的线程(一直运行)在后台进行入库.如果当前缓存中有记录,就写库,没有记录,

[Java Concurrent] wait / notifyAll 的简单案例

本案例描述的是,给一辆汽车打蜡.抛光的场景. Car 是一辆被打蜡抛光的汽车,扮演共享资源的角色. WaxOnCommand 负责给汽车打蜡,打蜡时需要独占整部车,一次打一部分蜡,等待抛光,然后再打一部分蜡. BuffCommand 负责给汽车抛光,抛光时需要独占整部车,每一次会将刚打上的蜡抛光,然后等待打蜡,然后再将刚打上的蜡抛光. WaxOnCommand .BuffCommand 分别由两个线程相互交替地执行: WaxOnCommand 打蜡.等待抛光,BuffCommand 抛光,等待打