JAVA并发实现四(守护线程和线程阻塞)

守护线程

 

  Java中有两类线程:User Thread(用户线程)、Daemon Thread(守护线程) spa

 

     用户线程即运行在前台的线程,而守护线程是运行在后台的线程。 守护线程做用是为其余前台线程的运行提供便利服务,并且仅在普通、非守护线程仍然运行时才须要,好比垃圾回收线程就是一个守护线程。当VM检测仅剩一个守护线程,而用户线程都已经退出运行时,VM就会退出,由于没有若是没有了被守护者,也就没有继续运行程序的必要了。若是有非守护线程仍然存活,VM就不会退出。.net

 

     守护线程并不是只有虚拟机内部提供,用户在编写程序时也能够本身设置守护线程。用户能够用Thread的setDaemon(true)方法设置当前线程为守护线程。线程

 

    虽然守护线程可能很是有用,但必须当心确保其余全部非守护线程消亡时,不会因为它的终止而产生任何危害。由于你不可能知道在全部的用户线程退出运行前,守护线程是否已经完成了预期的服务任务。一旦全部的用户线程退出了,虚拟机也就退出运行了。 所以,不要在守护线程中执行业务逻辑操做(好比对数据的读写等)。、code

 

    另外有几点须要注意:对象

    一、setDaemon(true)必须在调用线程的start()方法以前设置,不然会跑出IllegalThreadStateException异常。blog

    二、在守护线程中产生的新线程也是守护线程。  
    三、 不要认为全部的应用均可以分配给守护线程来进行服务,好比读写操做或者计算逻辑。 get

 

线程阻塞

 

    线程能够阻塞于四种状态:虚拟机

    一、当线程执行Thread.sleep()时,它一直阻塞到指定的毫秒时间以后,或者阻塞被另外一个线程打断;it

    二、当线程碰到一条wait()语句时,它会一直阻塞到接到通知(notify())、被中断或通过了指定毫秒时间为止(若制定了超时值的话)io

    三、线程阻塞与不一样I/O的方式有多种。常见的一种方式是InputStream的read()方法,该方法一直阻塞到从流中读取一个字节的数据为止,它能够无限阻塞,所以不能指定超时时间;

    四、线程也能够阻塞等待获取某个对象锁的排他性访问权限(即等待得到synchronized语句必须的锁时阻塞)。

 

    注意,并不是全部的阻塞状态都是可中断的,以上阻塞状态的前两种能够被中断,后两种不会对中断作出反应

 

参考:http://blog.csdn.net/ns_code/article/details/17099981

相关文章
相关标签/搜索