Java线程运行周期方法和多线程模式概述


1、Java线程周期方法:

new(),

start(),

run(),

dead,

block:被另一线程阻塞;resume:唤醒;

sleep:释放CPU,不释放锁;

wait:释放CPU,释放锁;

notify,notifyAll:唤醒通知,对应wait;

yield:临时暂停,让线程将资源释放;

join:调用线程,等待线程结束后再执行;

synchronized:用于保护共享数据;


wait,notify,notifyAll是Object类的方法,sleep和yield是Thread类的方法;

谈下使用线程方法interrupt和InterruptException如何优雅结束线程。
首先,interrupt方法是线程的实例方法,即线程对象调用之。当线程对象调用了该方法后,本质是对该线程对象的中断标志位进行置位操作。线程在进入sleep、join、wait这三个方法后会不断检查中断标志位,一旦中断标志位被置位,则抛出InterruptException,于是会退出死循环进入catch语句,也就是退出了线程(一般情况下不会在catch中死循环吧?)。
对于sleep、join来说,只要检测到中断标志位被置位就立刻抛出InterruptException,而wait由于此时线程已经交出了锁,所以要重新获取到锁之后才可以抛出异常。
另外,线程的实例方法isInterrupted是检测线程中断标志位是否被置位的方法,interrupted则是检查中断标志位后将标志位清空(如果已经被置位)。

2、Java多线程设计模式:

2.1、Single Thread Execution(单线程执行)
用于处理能通过这座桥的只有一个人

参考链接:http://blog.csdn.net/sinat_23092639/article/details/52549374


2.2、Immutable Pattern(不变模式)


一个类的内部状态创建后,在整个生命期间都不会发生变化时,就是不变类。这种使用不变类的做法叫做不变模式。


一个类的对象的字段在初始化之后就不可改变的类我们叫做Immutable的类(当然,就算了字段全部指明为private final,并且没有setter方法,如果字段不详上面那样是String这种不可改变数值的类,仍然不是一个Immutable的类,因为getter会将字段的引用交给外部类)这种类的优点在于在高并发的条件下,不需要synchronized来保护,可以在不丧失安全性和生命性的前提下提高程序的执行性能。

参考链接:http://blog.csdn.net/sinat_23092639/article/details/52659780


2.3、Guarded Suspension守卫暂停


参考链接:http://blog.csdn.net/sinat_23092639/article/details/52892094 

http://blog.csdn.net/alajl/article/details/1815982


2.4、消费者生产者模式(Customer-Product)

所谓生产者,就是产生数据的线程,消费者,就是使用数据的线程。两个线程的速度差将成为最大的问题,而该模式就是缓冲两者的速度差。一般来说,生产者和消费者会有多个。

1.将产生数据和使用数据两个流程分离解耦,让二者不互相依赖以至于相互影响,大家都靠缓冲区进行交互,这是一种好的设计方式。
就比如顾客吃蛋糕如果每次都要找到厨师拿,如果厨师换人了顾客就不认识了拿不到蛋糕了。
2.由于生产者与消费者是两个独立的并发体,他们之间是用缓冲区作为桥梁连接,生产者只需要往缓冲区里丢数据,就可以继续生产下一个数据,而消费者只需要从缓冲区了拿数据即可,这样就不会因为彼此的处理速度而发生阻塞。就比如顾客吃的速度比厨师做得快,这样顾客要吃蛋糕只能一直等待厨师而不能做其他事。同理,当厨师做蛋糕速度快过顾客吃的时候,顾客还没吃完,厨师就必须等顾客有人吃完才可以把蛋糕给他再回去做蛋糕。

参考链接:http://blog.csdn.net/sinat_23092639/article/details/53054114


2.5、Worker Thread(线程池)

所谓线程池,就是对线程的复用,当线程执行完任务之后就继续取其他任务执行,而不是销毁启动新线程执行其他任务。因为线程的启动对于系统性能开销比较大,所以这样对于系统性能的提高很有好处。

参考链接:http://blog.csdn.net/sinat_23092639/article/details/53148468


2.6、ReadWriteLock(读写锁)

并发包中有读写锁类ReadWriteLock,他的功能是使得当多个线程读和多个线程写同一块数据的情况下,允许多线程同时读,但是有线程在读的时候不允许写操作,只允许一个时刻只有一个线程在写,即读写互斥,写写互斥,读读不互斥。


参考链接:http://blog.csdn.net/sinat_23092639/article/details/53233722


2.7、Future Pattern(未来模式)

Future是这样一种Pattern: 它本身表示‘将来(future)’
你提交一个异步的任务 比如提交到一个threadpool
与此同时拿到一个Future对象 任务的执行是异步的
这时候你可以去做其它的事情 等到异步任务结束的时候 你可通过前面的Future对象拿到异步执行的任务的结果
异步执行结束后,自动通知用户异步任务结束了,你可以通过Future来获取执行结果了。

参考链接:http://blog.csdn.net/sinat_23092639/article/details/53353640


2.8、Active Object(主动对象)

一般来说是指自己拥有独立的线程的对象,在这里不只是拥有独立线程,还可从外部接受异步消息,并能配合需要返回处理结果。

参考链接:http://blog.csdn.net/sinat_23092639/article/details/53452970

参考链接:http://blog.csdn.net/sinat_23092639/article/details/53452970

关注微信公众号和今日头条,精彩文章持续更新中。。。。。




阅读更多
版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/wufaliang003/article/details/56667128
个人分类: Java基础
想对作者说点什么? 我来说一句

没有更多推荐了,返回首页

关闭
关闭
关闭