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

原创 2017年02月23日 11:03:33


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

版权声明:本文为博主原创文章,未经博主允许不得转载。

相关文章推荐

JAVA基础再回首(二十四)——多线程的概述、实现方式、线程控制、生命周期、多线程程序练习、安全问题的解决

JAVA基础再回首(二十四)——多线程的概述、实现方式、线程控制、生命周期、多线程程序练习、安全问题的解决 版权声明:转载必须注明本文转自程序员杜鹏程的博客:http://blog.csdn.ne...
  • m366917
  • m366917
  • 2016年09月30日 15:56
  • 1382

Java多线程总结(2) — 线程生命周期中常用方法

1. 线程的状态回顾  线程从创建到最终的消亡,要经历若干个状态。一般来说,线程包括以下这几个状态:(原文更好理解,就不翻译了) New When we create a new Thread obj...
  • Mark_LQ
  • Mark_LQ
  • 2015年12月14日 22:19
  • 642

Java多线程通信-利用传统的线程通信wait(),notify()方法实现“生产者消费者模式”

想利用传统的线程通信wait(),notify(),notifyAll()方法,必须依赖于同步监听器的存在,也就是说,对于synchronized修饰的同步方法,因为该类的默认实例(this)就是同步...
  • HD1099
  • HD1099
  • 2015年08月05日 20:02
  • 677

java 多线程总结(一) 创建线程的几种方法及对终止线程运行的讨论

多线程作为Java中很重要的一个知识点,在此还是有必要总结一下的。 一.线程的生命周期及五种基本状态 关于Java中线程的生命周期,首先看一下下面这张较为经典的图: 上图中基本上囊括了Jav...

Java基础:多线程(1)--线程的概述、创建线程的方式、线程的多种状态、线程常用的方法

一、线程的概述进程:正在运行的程序,负责了这个程序的内存空间分配,代表了内存中的执行区域。 线程:就是在一个进程中负责一个执行路径。 多线程:就是在一个进程中多个执行路径同时执行。1.1 多线程的...
  • Yummmy_
  • Yummmy_
  • 2017年03月25日 00:13
  • 344

java多线程之线程生命周期和状态控制

java线程的生命周期和状态控制 一、线程的生命周期 线程状态转换图: 1、新建状态 用new关键字和Thread类或其子类建立一个线程对象后,该线程对象就处于新生状态。处于...
  • ajhsdj
  • ajhsdj
  • 2014年12月02日 15:53
  • 477

Java多线程、线程的生命周期和状态控制

Java多线程(二)、线程的生命周期和状态控制 一、线程的生命周期 线程状态转换图: 1、新建状态 用new关键字和Thread类或其子类建立一个线程对象后,该线程对象就处于新生状态。处于新...
  • zh521zh
  • zh521zh
  • 2015年12月09日 22:31
  • 3258

Java 多线程(三)——线程的生命周期

线程的生命周期:新建、就绪、执行、阻塞、终止。 Java中如何控制线程:sleep(),join(),yield(),setPriority(int)...
  • Zen99T
  • Zen99T
  • 2016年03月04日 20:36
  • 403

4. 初学Java多线程:线程的生命周期

初学Java多线程系列的本部分介绍线程的生命周期。与人有生老病死一样,线程也同样要经历开始(等待)、运行、挂起和停止四种不同的状态。这四种状态都可以通过Thread类中的方法进行控制。与人有生老病死一...

新手学JAVA(十一)-多线程----线程的生命周期

新建和就绪状态 运行状态和阻塞状态 线程死亡    当一个线程被创建并启动之后,并不是一开始就处于执行状态,已不是一直处于运行状态。线程也是有生命周期的,包括:创建(New)、就绪(Runnable)...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:Java线程运行周期方法和多线程模式概述
举报原因:
原因补充:

(最多只允许输入30个字)