当前位置:   article > 正文

并发编程笔记——多线程设计模式_java 多线程设计模式

java 多线程设计模式

1.Single Threaded Execution模式

单线程执行模式:指“以⼀个线程执⾏”。该模式⽤于设置限制,以确保同⼀时间只能让⼀个线程执⾏处理。

2.Immutable模式

不可变模式:存在确保实例状态不发⽣改变的类。在访问这些实例时不需要执⾏耗时的互斥处理。

String就是采用的这种模式。

3.Guarded Suspension模式

保护暂停/等待模式:存在一个守护条件,如果守护条件不成⽴(执⾏现在的处理会造成问题),就让执⾏处理的线程进⾏等待。

LinkedBlockingQueue阻塞队列就是这种模式,当take()方法未获取到数据时线程会阻塞。

4.Balking模式

立即中断模式:与Guarded Suspension模式⼀样,也存在守护条件。如果守护条件不成⽴,则⽴即中断处理。
何时使用:1.不需要执⾏时,2.不需要等待守护条件成⽴时,3.守护条件仅在第⼀次成⽴时,例如初始化某个类

还有中介于Guarded Suspension和Balking之间的方法,即不立即中断也不一直等待,而是等待一段时间再中断。使用此模式的有:
(以下是通过异常通知超时)
java.util.concurrent.Future的get⽅法;
java.util.concurrent.Exchanger的exchange⽅法;
java.util.concurrent.Cyclicarrier的await⽅法
java.util.concurrent.CountDownLatch的await⽅法。
(以下是通过返回值通知超时)
java.util.concurrent.BlockingQueue接⼝,当offer⽅法的返回值为false,或poll⽅法的返回值为null,表示发⽣了超时。
java.util.concurrent.Semaphore类,当tryAcquire⽅法的返回值为false时,表示发⽣了超时。
java.util.concurrent.locks.Lock接⼝,当tryLock⽅法的返回值为false时,表示发⽣了超时。

5.Prdoducer-Consumer模式

生产者-消费者模式:
⽣产者安全地将数据交给消费者。
当⽣产者和消费者以不同的线程运⾏时,两者之间的处理速度差异会有问题。
⽣产者消费者模式⽤于消除线程间处理速度的差异带来的问题。
在该模式中,⽣产者和消费者都有多个,当⽣产者和消费者只有⼀个时,我们称为管道(Pipe)模式。

JUC中BlockingQueue的实现就是用的生产者-消费者模式。

6.Read-Write Lock模式

读写锁模式:
读取操作和写⼊操作分开考虑,读读不互斥,写写互斥,读写互斥。
适合读取操作负载较⼤的情况。

JUC包中的ReadWriteLock接⼝和ReentrantReadWriteLock类就是该种设计模式。

7.Thread-Per-Message模式

每个消息⼀个线程模式:
在Thread-Per-Message模式中,消息的委托⽅和执⾏⽅是不同的线程。每次消息过来,委托方会将消息委托给一个新的线程(执行方)来执行,这样可以立即响应客户端,让执行方慢慢执行任务。

  1. 提⾼响应性,缩短延迟时间
  2. 适⽤于操作顺序没有要求时
  3. 适⽤于不需要返回值时
  4. 应⽤于服务器

JUC包的Thread-Per-Message模式应用:
java.lang.Thread类
java.lang.Runnable接⼝
java.util.concurrent.ThreadFactory接⼝
java.util.concurrent.Executors
java.util.concurrent.Executor接⼝
java.util.concurrent.ExecutorService接⼝
java.util.concurrent.ScheduledExecutorService类

8. Worker Thread模式

工作线程模式:会逐个取回⼯作并进⾏处理。当所有⼯作全部完成后,工作线程会等待新的⼯作到来。
Worker Thread模式也被称为Background Thread模式。有时也称为Thread Pool模式。
Worker Thread模式的优点:
1.提⾼吞吐量
2.容量控制
3.调⽤与执⾏的分离(提⾼响应速度,可以分布式部署)

JUC包的Worker Thread模式:
java.util.concurrent.ThreadPoolExecutor类
java.util.concurrent.Executors 类

9. Future模式

未来模式:假设由⼀个⽅法需要⻓时间执⾏才能获取结果,则⼀般不会让调⽤的程序等待,⽽是先返回给它⼀张“提货卡”。获取提货卡并不消耗很多时间。该“提货卡”就是Future⻆⾊。

  1. 使⽤Thread Per Message模式,可以提⾼程序响应性,但是不能获取结果。Future模式也可以提⾼程序响应性,还可以获取处理结果。
  2. 利⽤Future模式异步处理特性,可以提⾼程序吞吐量。虽然并没有减少业务处理的时⻓,但是如果考虑到I/O,当程序进⾏磁盘操作时,CPU只是处于等待状态。CPU有空闲时间处理其他的任务。
  3. “准备返回值”和“使⽤返回值”的分离。
  4. 如果想等待处理完成后获取返回值,还可以考虑采⽤回调处理⽅式。即,当处理完成后,由Host⻆⾊启动的线程调⽤Client⻆⾊的⽅法,进⾏结果的处理。此时Client⻆⾊中的⽅法需要线程安全地传递返回值。

JUC包中的应用:
java.util.concurrent.Callable
java.util.concurrent.Future
java.util.concurrent.FutureTask

本文内容由网友自发贡献,转载请注明出处:【wpsshop博客】
推荐阅读
相关标签
  

闽ICP备14008679号