JAVA Thread类解读

JAVA Thread类主要方法解读

JVM允许应用拥有多个线程并发执行。每个线程都有优先级(默认是5),优先级高的比优先级低的线程有优势。另外,每个线程可以标志为Daemon线程,或者非Daemon线程。在一个正在执行的线程中创建一个新的Thread对象,该对象与创建它的线程优先级初始化成一致。此外,Daemon的线程创建的Thread对象肯定是Daemon线程。JVM启动的时候,被执行main方法的类会被执行成一个非Daemon的线程。JVM会在以下两个条件下终止运行:

  • 1.Runtime.getRuntime().exit()被执行,并且安全管理器已经允许exit操作生效;
  • 2.所有的非Daemon线程都已经死亡,所有的线程要么从run方法返回,要么异常已经传递到run方法之外。

创建一个Thread对象的方法有两种:继承Thread类,或者实现Runnable接口。

1.构造函数

Thread() 可以指定的参数有:

ThreadGroup: 默认可以从当前现成的安全管理器中获取
Runnable: 需要执行run方法的对象
String: Thread的名称,可以重复
stackSize: 需要的栈长度,默认为0,即忽略该设置
AccessControlContext: 默认通过AccessController.getContext()获取,该参数并没有开放出来

2.线程状态 Thread.State

  • NEW: 没有执行过的线程
  • RUNNABLE: 正在执行的线程,该线程也许会因为等待期待资源在等待
  • BLOCKED: 等待监视锁,进入synchronized代码块、方法;或者可以重入的synchronized代码块、方法,别的线程调用了Object.wait方法
  • WAITING: 进入WAITING状态的几种情况
    • 调用了没有设置timeOut的Object.wait
    • 调用了没有设置timeOut的Thread.join
    • 调用了没有设置timeOut的LockSupport.park
      一个线程进入WAITING状态,是为了等待其他线程的一个特殊操作。比如一个调用了wait方法的线程,等待其他线程调用notify、notifyAll方法;或者,一个调用了Thread.join()等待一个特殊线程达到终止状态。
  • TIMED_WAITING : 进入TIMED_WAITING状态的几种情况:
    • 调用了Thread.sleep
    • 调用了设置timeOut的Object.wait
    • 调用了设置timeOut的Thread.join
    • 调用了LockSupport.parkNanos
    • 调用了LockSupport.parkUntil
  • TERMINATED:线程完成执行了。

3.线程状态修改

  • 3.1 中断线程

java中断原理 [http://www.infoq.com/cn/articles/java-interrupt-mechanism]

interrupt() 用于中断一个线程,线程自己可以中断自己,此外,如果checkAccess()(该方法用于判断是否可以修改当前线程,一般同一个线程组下的线程可以互相修改) 方法没有通过,则会收到一个 SecurityException

  • 调用wait()/wait(long)/wait(long, int),join ,sleep方法被阻塞,被中断时,中断状态被清空(设置为fale),并抛出一个InterruptedException
  • 被I/O操作阻塞,并且是一个可中断的通道,被中断时该通道会被关闭,设置中断状态(设置为true),并抛出一个 ClosedByInterruptException
  • 被Selector阻塞的线程,被中断时立即返回(跟wakeup方法类似),并设置中断状态;
  • 其他的情况,设置了中断状态。
    中断一个不是alive的线程,没有任何作用。

如果一个线程已经运行,并且没有终止,则认为是Alive的。

interrupted()测试当前线程是否已经被中断,并清空中断状态。

isInterrupted()测试当前线程是否已经被中断,但是不设置任何中断状态。

  • 3.2 暂停线程
    yield方法暗示调度器,当前线程愿意让出CPU资源,不过调度器可以随意的忽略该暗示。

  • 3.3 sleep
    sleep方法让当前线程休眠一定时间,但是不会放弃已经获取的锁。

目录

    • JAVA Thread类主要方法解读
      • 构造函数
      • 线程状态 ThreadState
      • 线程状态修改
      • 目录

你可能感兴趣的:(Java技术细节)