乐趣区

关于java:Java并发编程扩展线程通信线程池

之前我说过,实现多线程的形式有 4 种,然而之前的文章中,我只介绍了两种,那么上面这两种,能够理解理解,不懂没关系。

之前的文章——>Java 并发编程之多线程

应用 ExecutorServiceCallableFuture 实现有返回后果的线程

应用 ExecutorServiceCallableFuture 实现有返回后果的线程,也能够叫 线程池 形式。

ExecutorServiceCallableFuture三个接口都是属于 Executor 框架。可返回值的工作必须实现 Callable 接口。通过 ExecutorService 执行 Callable 工作后,能够获取到一个 Future对象 ,在该对象上调用get() 就能够获取到 Callable 工作返回的后果了。

留神:Futureget 办法是阻塞的,即线程无返回后果,get办法会始终期待。

其余创立线程的形式

除了以上四种次要的线程创立形式之外,也还有很多其余的形式能够启动多线程工作。比方通过 Timer 启动定时工作,或者通过像 Spring Taskquartz这样的 第三方工作 调度框架也能够开启多线程工作,对于第三方任务调度框架的例子还请查问相干材料。

线程通信

什么是线程通信?

当多个线程独特操作共享的资源时,相互告知本人的状态以防止资源抢夺。线程通信次要能够分为三种形式,别离为 共享内存、消息传递 和 管道流。

说白了就是用某些办法来获取线程的资源应用状态!

如何实现线程通信

wait办法 是 Object 类的办法 ,也就是说,所有的对象都有wait 办法,调用了一个对象的 wait 办法,取得这个对象锁 的线程将期待,并开释对象锁。

调用对象的 wait 办法时,肯定 要有一个线程取得对象的对象锁,否则抛出异样。

notify办法 :是Object 类的办法,调用一个对象的 notify 办法,在这个对象上期待的线程中随机唤醒一个。

nofifyAll办法:在这个对象上期待的线程全都唤醒。

sleepwait 的区别

  1. sleep是 Thread 类的办法,wait是 Object 类的办法。
  2. sleep不开释对象锁,wait开释对象锁。
  3. sleep只能到指定的工夫主动唤醒,wait能够指定工夫,也能够通过 notify 被动唤醒。

线程池

在我的项目中可能会创立大量的多线程,在执行完多线程后,线程对象被销毁,又有多线程需要时,再次创立多线程,要重复的创立、销毁线程。能够用线程池治理多线程。

扩大

线程池模式个别分为两种:HS/HA 半同步 / 半异步模式、L/ F 领导者与跟随者模式。

  • 半同步 / 半异步模式又称为生产者消费者模式,是比拟常见的实现形式,比较简单。分为同步层、队列层、异步层三层。同步层的主线程解决工作工作并存入工作队列,工作线程从工作队列取出工作进行解决,如果工作队列为空,则取不到工作的工作线程进入挂起状态。因为线程间有数据通信,因而不适于大数据量替换的场合。
  • 领导者跟随者模式,在线程池中的线程可处在 3 种状态之一:领导者 leader、追随者 follower 或工作者 processor。任何时刻线程池只有一个领导者线程。事件达到时,领导者线程负责音讯拆散,并从处于追随者线程中选出一个来当继任领导者,而后将本身设置为工作者状态去处理该事件。处理完毕后工作者线程将本身的状态置为追随者。这一模式实现简单,但防止了线程间替换工作数据,进步了 CPU cache 相似性。在 ACE(Adaptive Communication Environment)中,提供了领导者跟随者模式实现。

线程池的 伸缩性 对性能有较大的影响。

  • 创立太多线程,将会节约肯定的资源,有些线程未被充沛应用。
  • 销毁太多线程,将导致之后浪费时间再次创立它们。
  • 创立线程太慢,将会导致长时间的期待,性能变差。
  • 销毁线程太慢,导致其它线程资源饥饿。

退出移动版