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
关注微信公众号和今日头条,精彩文章持续更新中。。。。。
热门跟贴