线程的六种状态

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

Java 多线程(一)Thread的更多相关文章

  1. Java 多线程(1)-Thread和Runnable

    一提到Java多线程,首先想到的是Thread继承和Runnable的接口实现 Thread继承 public class MyThread extends Thread { public void ...

  2. Java多线程01(Thread类、线程创建、线程池)

    Java多线程(Thread类.线程创建.线程池) 第一章 多线程 1.1 多线程介绍 1.1.1 基本概念 进程:进程指正在运行的程序.确切的来说,当一个程序进入内存运行,即变成一个进程,进程是处于 ...

  3. JAVA多线程(一) Thread & Runnable

    githut代码地址:https://github.com/showkawa/springBoot_2017/tree/master/spb-demo/spb-brian-query-service/ ...

  4. java多线程创建-Thread,Runnable,callable和threadpool

    java创建多线程的方式有许多种,这里简要做个梳理 1. 继承Thread类 继承java.lang.Thread类,创建本地多线程的类,重载run()方法,调用Thread的方法启动线程.示例代码如 ...

  5. Java 多线程之 Thread 类 和 Runnable 接口初步使用

    目录 Thread 类 Thread之定义线程类 Thread之开启线程 Runnable 接口 Runnable 之定义线程类 Runnable 之开启线程 @ Thread 类 Thread 类是 ...

  6. Java 多线程(Thread)学习

    多线程:就是进程的扩展,实现并发.一个进程可以包含多个线程,进程一般是由操作系统控制,而线程就是由程序员控制的,所以作为编程人员做好线程是我们的重点. 线程和进程一样分为五个阶段:创建.就绪.运行.阻 ...

  7. java 多线程:Thread 并发线程: 方法同步synchronized关键字,与static的结合

    1.方法内的变量是安全的 方法内定义的变量,每个变量对应单独的内存变量地址,多个线程之间相互不影响.多个线程之间的变量根本没有一毛钱关系 public class ThreadFuncVarSafe ...

  8. java 多线程:Thread类常用方法:setPriority优先级、interrupt中断标记、suspend暂停与唤醒resume(已过时);daemon守护线程

    常用方法: boolean isAlive() 测试此线程是否存活. boolean isDaemon() 测试此线程是否为守护程序线程. static void sleep?(long millis ...

  9. java 多线程:Thread类;Runnable接口

    1,进程和线程的基本概念: 1.什么是进程: 进程(Process)是计算机中的程序关于某数据集合上的一次运行活动,是系统进行资源分配和调度的基本单位,是操作系统结构的基础.在早期面向进程设计的计算机 ...

  10. Java 多线程 (Thread 类)

    1.多线程 2.卖票 1.多线程实现 两种方式可以实现多线程: 继承 Thread 类,重写 run 方法:定义对象,调用 start 方法 创建类实现 Runnable 接口,作为实参传递给 thr ...

随机推荐

  1. C# 时间日期(函数,解释)

    C#时间/日期格式大全,C#时间/日期函数大全 有时候我们要对时间进行转换,达到不同的显示效果 默认格式为:2005-6-6 14:33:34 如果要换成成200506,06-2005,2005-6- ...

  2. In-Out Parameters inout keyword

    You write an in-out parameter by placing the inout keyword right before a parameter’s type. An in-ou ...

  3. 常用 CSS 选择器

    // css 读取顺序从右到左,符合要求的都会匹配 // 通配符选择器 -- 选择所有元素 * // 通配符选择器 -- 选择某个元素下的所有元素 .demo * // 元素选择器 html,body ...

  4. When you hit a wall, just kick it in.

    Teach Yourself Programming in Ten Years. ----- Peter Norvig Teach Yourself Programming in Ten Years  ...

  5. Python笔记17---------魔法方法

    魔法方法也为特殊方法,即用两个下划线形成的(__方法__).自己定义的方法最好不要采用这种方式,因为这些方法会在一些特殊的情况下直接被调用. 1.第一个魔法方法:类中常用的__init__()方法:相 ...

  6. babel把ES6转化为ES5的时候报错

    Module not found: Error: Can't resolve '@babel/runtime/helpers/asyncToGenerator' in 'e:\Node.js\Node ...

  7. P1265 公路修建 (prim)

    题目描述 某国有n个城市,它们互相之间没有公路相通,因此交通十分不便.为解决这一"行路难"的问题,政府决定修建公路.修建公路的任务由各城市共同完成. 修建工程分若干轮完成.在每一轮 ...

  8. vim+astyle安装使用

    astyle下载安装 wget https://sourceforge.net/projects/astyle/files/astyle/astyle%203.1/astyle_3.1_linux.t ...

  9. 03.IO读写-1.IO介绍

    1 文件操作介绍 in: 输入,读入.从硬盘中读到内存 out: 输出.从内存写到硬盘 文件的作用: 数据存储 2 文件的打开与关闭 2.1 打开文件 在Python,使用open函数,可以打开一个已 ...

  10. 提高生产力:SpringMVC中,使用扩展数据类型TypedMap接收Web请求参数

    在Web项目中,如果前端MVC框架使用的是SpringMVC,可以使用Map接收前端请求参数,比bean要方便很多. 尤其是SpringMVC和Mybatis一起用的时候,用Map大大减少了需要的be ...