资讯专栏INFORMATION COLUMN

并发学习笔记(3)

CntChen / 3409人阅读

摘要:死亡状态终止状态线程完成执行后的状态。守护线程唯一的用途就是为其他线程服务。计时线程就是一个守护线程它定时地发送计时器滴答信号给其他线程或清空过时的高速缓存项的线程。

虽是读书笔记,但是如转载请注明出处 http://segmentfault.com/blog/exploring/
.. 拒绝伸手复制党

Thread 线程的几种状态

线程具有新建、可运行、阻塞、等待、定时等待、死亡六种。线程的状态完全包含了一个线程从新建到运行,最后到结束的整个生命周期,

线程状态的具体信息如下:

NEW(新建状态、初始化状态):线程对象已经被创建,但是还没有被启动时的状态。这段时间就是在我们调用new命令之后,调用start()方法之前

    public enum State {
        /**
         * Thread state for a thread which has not yet started.
         */
        NEW,      

RUNNABLE(可运行状态、就绪状态):在我们调用了线程的start()方法之后线程所处的状态。处于RUNNABLE状态的线程在JAVA虚拟机(JVM)上是运行着的,但是它可能还正在等待操作系统分配给它相应的运行资源以得以运行。

一旦一个线程开始运行,它不必始终保持运行。运行中的线程可能被中断,为了让其他线程获得运行机会 -- 线程调度。 现在所有的桌面和服务器OS都使用抢占式调用

 /**
         * Thread state for a runnable thread.  A thread in the runnable
         * state is executing in the Java virtual machine but it may
         * be waiting for other resources from the operating system
         * such as processor.
         */
        RUNNABLE,

BLOCKED(阻塞状态、被中断运行):当一个线程试图获取一个内部的对象锁,而该锁被其他线程持有,则该线程进入阻塞状态;当所有其他线程释放该锁,并且线程调度器要允许本线程持有它的时候,该线程将变成非阻塞状态。

        /**
         * Thread state for a thread blocked waiting for a monitor lock.
         * A thread in the blocked state is waiting for a monitor lock
         * to enter a synchronized block/method or
         * reenter a synchronized block/method after calling
         * {@link Object#wait() Object.wait} .
         */
        BLOCKED,

当线程等待另一个线程通知调度器的一个条件时,它自己进入等待状态。
当前线程调用了java.lang.Object.wait()java.lang.Thread.join()或者等待java.util.concurrent库中的LockCondition时,就会进入等待状态

比如一个线程调用了某个对象的wait()方法,正在等待其它线程调用这个对象的notify()或者notifyAll()(这两个方法同样是继承自Object类)方法来唤醒它;或者一个线程调用了另一个线程的join()(这个方法属于Thread类)方法,正在等待这个方法运行结束。

        /**
         * Thread state for a waiting thread.
         * A thread is in the waiting state due to calling one of the
         * following methods:
         * 
    *
  • {@link Object#wait() Object.wait} with no timeout
  • *
  • {@link #join() Thread.join} with no timeout
  • *
  • {@link LockSupport#park() LockSupport.park}
  • *
* *

A thread in the waiting state is waiting for another thread to * perform a particular action. * * For example, a thread that has called Object.wait() * on an object is waiting for another thread to call * Object.notify() or Object.notifyAll() on * that object. A thread that has called Thread.join() * is waiting for a specified thread to terminate. */ WAITING,

TIMED_WAITING(定时等待状态):当前线程调用了java.lang.Object.wait(long timeout)java.lang.Thread.join(long millis)java.util.concurrent.locks.LockSupport.packNanos(long nanos)java.util.concurrent.locks.LockSupport.packUntil(long deadline 四个方法中的任意一个,进入等待状态,但是与WAITING状态不同的是,它有一个最大等待时间,即使等待的条件仍然没有满足,只要到了这个时间它就会自动醒来。

         * Thread state for a waiting thread with a specified waiting time.
         * A thread is in the timed waiting state due to calling one of
         * the following methods with a specified positive waiting time:
         * 
    *
  • {@link #sleep Thread.sleep}
  • *
  • {@link Object#wait(long) Object.wait} with timeout
  • *
  • {@link #join(long) Thread.join} with timeout
  • *
  • {@link LockSupport#parkNanos LockSupport.parkNanos}
  • *
  • {@link LockSupport#parkUntil LockSupport.parkUntil}
  • *
*/ TIMED_WAITING,

TERMINATED(死亡状态、终止状态):

线程完成执行后的状态。线程执行完run()方法中的全部代码,从该方法中退出,进入TERMINATED状态。

还有一种情况是run()在运行过程中抛出了一个异常,而这个异常没有被程序捕获,导致这个线程异常终止进入TERMINATED状态

        /**
         * Thread state for a terminated thread.
         * The thread has completed execution.
         */
        TERMINATED;
    }

线程的属性

线程的属性:线程优先级,守护线程,线程组以及处理未捕获异常的处理器。

线程优先级

java语言,每一个线程有一个优先级. 默认情况,一个线程继承它父线程的优先级。

可以用setPriority方法降低或提高任何线程的优先级。 使用yield()方法让当前执行的线程处于让步,如果有其他的runnable线程具有至少与此线程同样的优先级,那么这些线程接下来会被调度。

java   /**
     * The minimum priority that a thread can have.
     */
    public final static int MIN_PRIORITY = 1;

   /**
     * The default priority that is assigned to a thread.
     */
    public final static int NORM_PRIORITY = 5;

    /**
     * The maximum priority that a thread can have.
     */
    public final static int MAX_PRIORITY = 10;
守护线程

可以通过调用

t.setDaemon(true);

将线程转换为守护线程。守护线程唯一的用途就是为其他线程服务。
计时线程就是一个守护线程:它定时地发送“计时器滴答”信号给其他线程或清空过时的高速缓存项的线程。

当只剩下守护线程,JVM就退出了。守护线程不应该去访问任何固有资源,如文件,数据库,因为它会在任何时候甚至在一个操作中发生中断。

未捕获异常处理器

线程run方法不能跑出任何被检测的异常,但是不被检测的异常会导致线程终止,这种情况,线程就死亡了。

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/64365.html

相关文章

  • Java 并发学习笔记(二)

    摘要:请参看前一篇文章并发学习笔记一原子性可见性有序性问题六等待通知机制什么是等待通知机制当线程不满足某个条件,则进入等待状态如果线程满足要求的某个条件后,则通知等待的线程重新执行。经极客时间并发编程实战专栏内容学习整理 请参看前一篇文章:Java 并发学习笔记(一)——原子性、可见性、有序性问题 六、等待—通知机制 什么是等待通知—机制?当线程不满足某个条件,则进入等待状态;如果线程满足要...

    zgbgx 评论0 收藏0
  • Java 并发学习笔记(一)——原子性、可见性、有序性问题

    摘要:最后,总结一下,导致并发问题的三个源头分别是原子性一个线程在执行的过程当中不被中断。可见性一个线程修改了共享变量,另一个线程能够马上看到,就叫做可见性。 计算机的 CPU、内存、I/O 设备的速度一直存在较大的差异,依次是 CPU > 内存 > I/O 设备,为了权衡这三者的速度差异,主要提出了三种解决办法: CPU 增加了缓存,均衡和内存的速度差异 发明了进程、线程,分时复用 CP...

    Chao 评论0 收藏0
  • Go语言核心36讲(Go语言实战与应用十二)--学习笔记

    摘要:除此之外,把并发安全字典封装在一个结构体类型中,往往是一个很好的选择。请看下面的代码如上所示,我编写了一个名为的结构体类型,它代表了键类型为值类型为的并发安全字典。在这个结构体类型中,只有一个类型的字段。34 | 并发安全字典sync.Map (上)我们今天再来讲一个并发安全的高级数据结构:sync.Map。众所周知,Go 语言自带的字典类型map并不是并发安全的。前导知识:并发安全字典诞生...

    不知名网友 评论0 收藏0

发表评论

0条评论

CntChen

|高级讲师

TA的文章

阅读更多
最新活动
阅读需要支付1元查看
<