线程的六种状态

1.新建状态

new了但是没有启动的线程的状态,如“Thread thread = new Thread()”,thread就是一个处于新建状态的线程。

2.运行状态

new出来的线程,调用strat()方法即处于入运行状态(Runnable),处于运行状态的线程可能正在Java虚拟机中运行,可能正在等待处理器的资源,因为一个线程必须获得CPU的资源后,才可运行其run()方法中的内容,否则排队等待。

3.阻塞状态

如果某个线程正在等待监视器锁,以便进入同步方法或同步方法块,那么这个线程就是阻塞状态的。

4.等待状态

某一线程因为调用不带超时Object的wait()方法,不带超时的Thread的join()方法,LockSupport的park()方法,就会处于等待状态。

5.超时等待状态

某一线程因为调用带有指定等待时间的Object的wait()方法,Thread的join()方法,Thread的sleep()方法,LockSupport的parkNanos()方法,LockSupport的parkUntil()方法,就会处于超时等待状态。

6.终止状态

线程调用终止或run()方法执行结束后,就会进入终止状态,处于终止状态的线程不具备继续运行的能力。

Thread实例的方法

start()方法

启动线程,等待CPU调用线程对象的run()方法,产生一个异步执行的效果。

注意: 多个线程同时调用start()方法时,CPU启动线程的顺序是随机的。调用start()方法的顺序不代表启动顺序。线程的启动具有随机性

run()方法

线程开始执行,虚拟机调用run()方法里面的内容

注意: 如果只调用run()方法,不调用start()方法启动线程,将全部由main函数执行,没有异步效果。只调用run()方法没有任何意义

isAlive()方法

测试线程是否处于活动状态,只要线程启动且没有终止,就会返回true

getId()方法

在一个Java应用中,有一个long型的全局唯一的线程ID生成器threadSeqNumber,每new出来一个线程,这个生成器都自增一次,并赋予线程的tId属性,这个是Thread自己做的,用户无法执行一个线程的Id

getName()方法

在new一个线程时,可以指定该线程的名字,通过getName()方法即可获得该线程的名字。如果不指定名字,Thread中有一个int型的全局唯一的线程初始号生成器threadInitNum,Java先把threadInitNum自增,然后以“Thread-threadInitNum”来命名新生成的线程

getPriority()方法和setPriority(int newPriority)方法

这两个方法用于获取和设置线程的优先级,优先级高的线程越容易先被执行,设置优先级有助于帮助“线程规划器”确定下一次选择哪个线程优先执行。两个在等待CPU的线程,优先级高的线程越容易被CPU执行

补充: 线程的默认优先级为5,如果不手动指定,线程的优先级具有继承性,比如线程main启动线程A,那么A的优先级和main的优先级相同。CPU会尽量将执行资源让给优先级高的线程

isDaemon()方法和setDaemon(boolean on)方法

判断该线程是否为守护线程,或将该线程设为守护线程(true)

Java中有两种线程,一种是守护线程,一种是用户线程。守护线程是一种特殊的线程,它的作用是为其他线程的运行提供便利的服务,最典型的应用便是GC线程。如果线程中只有守护线程了,那么守护线程会自动销毁。

注意: setDaemon()方法必须在start()方法之前

interrupt()方法

在线程受到阻塞时,抛出一个中断信号,使线程退出阻塞状态,没有被阻塞的线程,调用interrupt()方法没有作用

join()方法

join()方法的作用是等待线程销毁,join()方法会使得调用该方法的线程(如线程A.join()即A)所在的线程(如果在main方法中运行即main)无限阻塞,直到调用join()方法的线程销毁为止,main线程会无限阻塞直到线程A的run()方法执行完毕。

join(long millis)方法表示等待该线程销毁的时间最长为mills毫秒,该方法与sleep()方法的区别为:

sleep(2000)方法不释放锁,join(2000)方法释放锁。join()方法内部使用wait()方法,因此会释放锁。join()就是join(0)

public final void join() throws InterruptedException {
join(0);
}

join(long mills)的源码:

 public final synchronized void join(long millis)
throws InterruptedException {
long base = System.currentTimeMillis();
long now = 0; if (millis < 0) {
throw new IllegalArgumentException("timeout value is negative");
} if (millis == 0) {
while (isAlive()) {
wait(0);
}
} else {
while (isAlive()) {
long delay = millis - now;
if (delay <= 0) {
break;
}
wait(delay);
now = System.currentTimeMillis() - base;
}
}
}

Thread的静态方法

Thread类的静态方法表示操作的线程是“正在执行静态方法所在的代码块的线程”。Thread使用静态方法,就能对CPU当前正在运行的线程进行操作

currentThread()方法

currentThread()方法返回的是对当前正在执行线程的对象引用

注意: 线程类的构造方法,静态代码块是由main线程调用的,而线程类的run()方法是由应用线程自己调用(前提是启动了线程start()方法)

补充: this.XXX()方法和Thread.currentThread.XXX()方法中的对象不一定是相同的。换句话说就是当前执行的Thread未必就是Thread本身,比如执行线程的构造方法的是main线程,而不是该线程。

sleep(long millis)方法

让当前正在执行的线程休眠millis毫秒,这个“当前正在执行的线程”指的是Thread.currentThread()方法返回的线程。根据JDK API的说法:“该线程不丢失任何监视器的所属权”,简单说就是sleep代码上下文如果被加锁了,锁依然在,但CPU资源会让给其他线程。

yield()方法

暂停当前执行的线程对象,并执行其他线程。这个暂停会放弃CPU的资源,并且放弃CPU的资源不确定,有可能刚放弃就获得了资源,也有可能放弃好一会,CPU才执行

interrupted()方法

测试当前线程是否已经中断,执行后具有将状态标识清除为false的功能(线程的中断状态 由该方法清除),换句话说如果两次调用该方法,返回的必定是false

最新文章

  1. 通过 floating IP 访问 VIP - 每天5分钟玩转 OpenStack(126)
  2. Android Touch事件传递机制 一: OnTouch,OnItemClick(监听器),dispatchTouchEvent(伪生命周期)
  3. [转帖]The Lambda Calculus for Absolute Dummies (like myself)
  4. Pureftpd
  5. OpenMP之数值积分(求圆周率Pi)(sections)
  6. route 一个很奇怪的现象:我的主机能ping通同一网段的其它主机,并也能xshell 远程其它的主机,而其它的主机不能ping通我的ip,也不能远程我和主机
  7. jsp 格式化变量
  8. slf4j提示Class path contains multiple SLF4J bindings
  9. Tomcat8.5
  10. cometd的服务器配置
  11. GlassFish Server is a compliant implementation of the Java EE 7 platform
  12. Qt---在QLabel上实现系统时间
  13. c语言typedef运用与函数指针
  14. golang基础数据结构
  15. Ubuntu系统下在Eclipse中使用真实手机运行调试Android应用
  16. javascript 学习笔记 -内部类
  17. Java之Iterator
  18. RabbitMQ的介绍及使用进阶(Docker+.Net Core)
  19. filebeat 收集的进度日志查看
  20. Oracle课程档案,第十天

热门文章

  1. 解决启动httpd报: apr_sockaddr_info_get() failed for错误
  2. 关于Eclipse安装Scala插件不显示
  3. 函数GROUP_CONCAT
  4. CorelDRAW X8超低价优惠啦,你却还在用CDR X4破解?!
  5. httpclient模拟浏览器
  6. C++基础 (9) 第九天 编译器对模板类的二次编译 类模板 自定义数组类
  7. select的option触发事件
  8. nyoj26-孪生素数问题
  9. CentOS 7下搭建高可用集群
  10. MySQL SQL模式特点汇总