线程的六种状态

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. Aeroplane chess HDU - 4405_数学期望_逆推

    Code: #include<cstdio> #include<algorithm> #include<cstring> using namespace std; ...

  2. 网站出现502 bad getway

    最近项目之余,领导叫解决下系统网站经常出现502的问题,作为小头头的我,怎能不顶上. 流程开始走起,先查nginx,嗯,配置是大众的.是不是缓存溢出了呢.调节buffer的值 .貌似也没什么影响啊.5 ...

  3. linu问题集锦

    问题1 系统卡 慢 执行命令延迟/var/spool/mail下root文件过大导致/var磁盘空间92% cd / && du | sort -n | tail -n 10 查看排名 ...

  4. WEBGL学习【十】运动模型

    <!DOCTYPE HTML> <html lang="en"> <head> <title>LWEBGL6.2, Animated ...

  5. [caffe] caffe训练tricks

    Tags: Caffe Categories: Tools/Wheels --- 1. 将caffe训练时将屏幕输出定向到文本文件 caffe中自带可以画图的工具,在caffe路径下: ./tools ...

  6. Linux初级命令总结

    第1节 查看当前系统版本及内核 cat /etc/redhat-release (查看系统版本) CentOS Linux release 7.4.1708 (Core) uname -r (查看系统 ...

  7. 【ACM-ICPC 2018 南京赛区网络预赛 J】Sum

    [链接] 我是链接,点我呀:) [题意] 在这里输入题意 [题解] 线性筛求出每个数的最小质因子x for 从1-n 对于i,它的最小质因子为x 考虑i=ab 如果i能被x^3整除 那么这x怎么分配给 ...

  8. nodejs-安装及卸载

    linux下安装node 1.编译的方式安装​ 1 2 3 4 5 6 7 wget http://nodejs.org/dist/node-latest.tar.gz tar zxvf node-l ...

  9. html 页面刷新

    JS 脚本 方法1 setInterval 函数 定时局部刷新用到jQuery里面的setInterval方法, 该函数每隔一段时间请求一次数据,然后将请求结果返回给前端HTML实现刷新. setIn ...

  10. Java 微信公众号上传永久素材的方法

    Java 微信公众号上传永久素材的方法 学习了:http://blog.csdn.net/u013791374/article/details/53258275 膜拜一下,源码如下: @Request ...