当前位置: 首页 > 后端技术 > Java

Java并发编程扩展(线程通信,线程池)

时间:2023-04-01 23:03:05 Java

之前说过实现多线程有4种方式,但是在上一篇文章中,我只介绍了两种,所以下面两种,大家可以理解,其实并没有不懂也没关系。上一篇——>Java并发编程的多线程使用ExecutorService、Callable、Future实现有返回结果的线程使用ExecutorService、Callable、Future实现有返回结果的线程,也可以称为线程池方式。ExecutorService、Callable、Future这三个接口属于Executor框架。可以返回值的任务必须实现Callable接口。Callable任务通过ExecutorService执行后,可以得到一个Future对象,调用该对象的get()可以得到Callable任务返回的结果。注意:Future的get方法是阻塞的,即线程没有返回结果,get方法会一直等待。其他创建线程的方式除了上面四种主要的线程创建方式外,还有很多其他的方式来启动多线程任务。比如可以通过Timer启动定时任务,也可以通过SpringTask、quartz等第三方任务调度框架启动多线程任务。第三方任务调度框架示例请参考相关资料。线程通信什么是线程通信?当多个线程共同操作共享资源时,它们会互相告知自己的状态,以避免资源争用。线程通信主要可以分为三种方式,即共享内存、消息传递和管道流。说白了就是通过一些方法来获取线程的资源使用情况!线程通信wait方法如何实现:是Object类的一个方法,也就是说所有的对象都有一个wait方法。如果调用了对象的wait方法,获得对象锁的线程会等待并释放对象锁。调用对象的wait方法时,必须有线程获取该对象的对象锁,否则抛出异常。notify方法:是Object类的一个方法,调用一个对象的notify方法,随机唤醒其中一个等待这个对象的线程。nofifyAll方法:唤醒等待该对象的所有线程。sleep和wait的区别sleep是Thread类的一个方法,wait是Object类的一个方法。sleep不释放对象锁,wait释放对象锁。sleep只能在指定时间自动唤醒,wait可以指定时间,也可以通过notify主动唤醒。线程池可能会在项目中创建大量的多线程。多线程执行完毕后,线程对象被销毁。当需要多线程的时候,又要创建多线程,还要反复创建和销毁线程。可以使用线程池管理多个线程。扩展线程池模式一般分为两种:HS/HA半同步/半异步模式、L/Fleader和follower模式。半同步/半异步模式,又称生产者消费者模式,是一种比较常见的实现方式,也比较简单。它分为三层:同步层、队列层和异步层。同步层主线程处理工作任务并存入工作队列,工作线程从工作队列中取出任务进行处理。如果工作队列为空,则得不到任务的工作线程进入挂起状态。因为线程之间有数据通信,所以不适合大数据交换的场合。在leader-follower模式下,线程池中的线程可以处于三种状态之一:leaderleader、followerfollower或workerprocessor。线程池中任何时候都只有一个领导线程。当一个事件到来时,leader线程负责消息分离,并选择其中一个follower线程作为继任leader,然后将自己设置为worker来处理该事件。工作线程处理完后,将自己的状态设置为follower。这种模式实现起来比较复杂,但是避免了线程间交换任务数据,提高了CPU缓存的相似度。在ACE(AdaptiveCommunicationEnvironment)中,提供了leader-follower模式的实现。线程池的可扩展性对性能影响较大。创建过多的线程会浪费一定的资源,有些线程得不到充分利用。销毁太多线程会浪费时间稍后再次创建它们。创建线程太慢会导致长时间等待和低性能。销毁线程太慢,导致其他线程资源匮乏。

猜你喜欢