Java 多线程(一)Thread
线程的六种状态
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的更多相关文章
- Java 多线程(1)-Thread和Runnable
一提到Java多线程,首先想到的是Thread继承和Runnable的接口实现 Thread继承 public class MyThread extends Thread { public void ...
- Java多线程01(Thread类、线程创建、线程池)
Java多线程(Thread类.线程创建.线程池) 第一章 多线程 1.1 多线程介绍 1.1.1 基本概念 进程:进程指正在运行的程序.确切的来说,当一个程序进入内存运行,即变成一个进程,进程是处于 ...
- JAVA多线程(一) Thread & Runnable
githut代码地址:https://github.com/showkawa/springBoot_2017/tree/master/spb-demo/spb-brian-query-service/ ...
- java多线程创建-Thread,Runnable,callable和threadpool
java创建多线程的方式有许多种,这里简要做个梳理 1. 继承Thread类 继承java.lang.Thread类,创建本地多线程的类,重载run()方法,调用Thread的方法启动线程.示例代码如 ...
- Java 多线程之 Thread 类 和 Runnable 接口初步使用
目录 Thread 类 Thread之定义线程类 Thread之开启线程 Runnable 接口 Runnable 之定义线程类 Runnable 之开启线程 @ Thread 类 Thread 类是 ...
- Java 多线程(Thread)学习
多线程:就是进程的扩展,实现并发.一个进程可以包含多个线程,进程一般是由操作系统控制,而线程就是由程序员控制的,所以作为编程人员做好线程是我们的重点. 线程和进程一样分为五个阶段:创建.就绪.运行.阻 ...
- java 多线程:Thread 并发线程: 方法同步synchronized关键字,与static的结合
1.方法内的变量是安全的 方法内定义的变量,每个变量对应单独的内存变量地址,多个线程之间相互不影响.多个线程之间的变量根本没有一毛钱关系 public class ThreadFuncVarSafe ...
- java 多线程:Thread类常用方法:setPriority优先级、interrupt中断标记、suspend暂停与唤醒resume(已过时);daemon守护线程
常用方法: boolean isAlive() 测试此线程是否存活. boolean isDaemon() 测试此线程是否为守护程序线程. static void sleep?(long millis ...
- java 多线程:Thread类;Runnable接口
1,进程和线程的基本概念: 1.什么是进程: 进程(Process)是计算机中的程序关于某数据集合上的一次运行活动,是系统进行资源分配和调度的基本单位,是操作系统结构的基础.在早期面向进程设计的计算机 ...
- Java 多线程 (Thread 类)
1.多线程 2.卖票 1.多线程实现 两种方式可以实现多线程: 继承 Thread 类,重写 run 方法:定义对象,调用 start 方法 创建类实现 Runnable 接口,作为实参传递给 thr ...
随机推荐
- Spring boot application.properties 配置
原文链接: http://docs.spring.io/spring-boot/docs/current/reference/html/common-application-properties.ht ...
- 开启RxSwift之旅——开篇
开启RxSwift之旅——开篇 RxSwift 是 ReactiveX 在 Swift 下的实现.ReactiveX 是一个通过使用可观察序列来组合异步和基于事件的程序的库. 很多地方通常把 Reac ...
- Linux 中文件名颜色所代表的属性
1. 白色:表示一般文件 2. 蓝色:表示目录 3. 绿色:表示可执行的文件或程序 4. 浅蓝色:表示链接文件 5. 黄色:表示设备文件 6. 灰色:表示其他类型文件 7. 红色:表示压缩文件或者包文 ...
- 【转】linux 增加用户 useradd 用法小结及配置文件说明
原文地址:https://blog.csdn.net/warden2010/article/details/5132290 在Linux 系统中,所有的用户和组像一个国家.如果国家要繁荣昌盛的话,需要 ...
- Ubuntu 16.04 安装python3.6 环境并设置为默认
1.添加python3.6安装包,并且安装 sudo apt-get install software-properties-common 2.下载python3.6 sudo add-apt-rep ...
- Javaee 内部引用
1.final修饰类,修饰方法,修饰变量有什么特点? final修饰的类不能被继承太监类,可以被继承使用但不能修改,如果父类没有final修饰的方法子类可以添加上,成员变量需要在建类前被赋值且不能改动 ...
- kali 安装nessus
下载home版: http://www.tenable.com/products/nessus/select-your-operating-system#tos 获取激活码:http://www.te ...
- List或者Map等对象创建语句放在循环外和循环内的区别
每一个对象创建的时候都会有一个ID,List对象在执行add方法的时候是将对象的引用放入List中. 如果把创建Map对象的语句放在外面,在将对象add到List中时,前后向List中add的对象都是 ...
- kernel相关前沿技术了解
Intel MPX https://en.wikipedia.org/wiki/Intel_MPX SPDK http://aidaiz.com/spdk/ TCMalloc http://goog- ...
- GDI 像素(5)
RGB 颜色 使用 RGB 宏可以创建一个由三个整数值(R.G.B)的 COLORREF 值. COLORREF RGB( BYTE byRed, // 红色值(R) BYTE byGreen, // ...