【Java并发编程】之四:守护线程与线程阻塞的四种情况

原创 2013年12月05日 21:28:08

转载请注明出处:http://blog.csdn.net/ns_code/article/details/17099981

    

守护线程


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


     用户线程即运行在前台的线程,而守护线程是运行在后台的线程。 守护线程作用是为其他前台线程的运行提供便利服务,而且仅在普通、非守护线程仍然运行时才需要,比如垃圾回收线程就是一个守护线程。当VM检测仅剩一个守护线程,而用户线程都已经退出运行时,VM就会退出,因为没有如果没有了被守护这,也就没有继续运行程序的必要了。如果有非守护线程仍然存活,VM就不会退出。


     守护线程并非只有虚拟机内部提供,用户在编写程序时也可以自己设置守护线程。用户可以用Thread的setDaemon(true)方法设置当前线程为守护线程。


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


    另外有几点需要注意:

    1、setDaemon(true)必须在调用线程的start()方法之前设置,否则会跑出IllegalThreadStateException异常。

    2、在守护线程中产生的新线程也是守护线程。  
    3、 不要认为所有的应用都可以分配给守护线程来进行服务,比如读写操作或者计算逻辑。 


线程阻塞


    线程可以阻塞于四种状态:

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

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

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

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


    注意,并非所有的阻塞状态都是可中断的,以上阻塞状态的前两种可以被中断,后两种不会对中断做出反应

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

相关文章推荐

多线程之Java线程阻塞与唤醒

线程的阻塞和唤醒在多线程并发过程中是一个关键点,当线程数量达到很大的数量级时,并发可能带来很多隐蔽的问题。如何正确暂停一个线程,暂停后又如何在一个要求的时间点恢复,这些都需要仔细考虑的细节。在Java...

java多线程——阻塞与唤醒

三、java线程的阻塞及唤醒 1. sleep() 方法: sleep(…毫秒),指定以毫秒为单位的时间,使线程在该时间内进入线程阻塞状态,期间得不到cpu的时间片,等到时间过去了,线程重新进入可...

Java多线程(四)——线程阻塞四种情况与守护线程

线程阻塞四种状态1、当线程执行Thread.sleep()时,它一直阻塞到指定的毫秒时间之后,或者阻塞被另一个线程打断;2、当线程碰到一条wait()语句时,它会一直阻塞到接到通知(notify())...

线程阻塞的原因

线程在运行的过程中因为某些原因而发生阻塞,阻塞状态的线程的特点是:该线程放弃CPU的使用,暂停运行,只有等到导致阻塞的原因消除之后才回复运行。或者是被其他的线程中断,该线程也会退出阻塞状态,同时抛出I...

java线程的阻塞

线程的阻塞     为了解决对共享存储区的访问冲突,Java 引入了同步机制,现在让我们来考察多个线程对共享资源的访问,显然同步机制已经不够了,因为在任意时刻所要求的资源不一定已经准备好了被访问...
  • seelye
  • seelye
  • 2012年06月12日 17:44
  • 16100

线程、内存、锁定和阻塞(Threads, Memory, Locking, and Blocking)

线程、内存、锁定和阻塞(Threads, Memory, Locking, and Blocking)   如果你真的想进行并行编程的话,花点时间理解线程和内存的概念是完全值得的。在这一节,我们将...
  • hadstj
  • hadstj
  • 2014年05月12日 15:30
  • 3326

Java线程阻塞与中断

线程阻塞和中断 1、线程阻塞 一个线程进入阻塞状态可能的原因: ①通过调用sleep(millseconds)使任务进入休眠状态; class Demo1 implemen...

阻塞方法与中断方法

1.线程可能在执行过程中阻塞或者暂停执行,例如等待IO结束,等待获得一个锁,等待从Thread.sleep方法中醒来,或者等待另一个线程的计算结果。2.阻塞方法:BlockingQueue的put和t...

多线程学习之线程阻塞机制

为了解决对共享存储区的访问冲突,Java 引入了同步机制,现在让我们来考察多个线程对共享资源的访问,显然同步机制已经不够了,因为在任意时刻所要求的资源不一定已经准备好了被访问,反过来,同一时刻准备好了...

线程阻塞的原因

线程阻塞的原因 导致线程阻塞的原因主要由以下几方面。 1、线程执行了Thread.sleep(int n)方法,线程放弃CPU,睡眠n毫秒,然后恢复运行。 2、线程要执行一段同步代码...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:【Java并发编程】之四:守护线程与线程阻塞的四种情况
举报原因:
原因补充:

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