java线程状态和线程方法
来源:互联网 发布:智能算法 编辑:程序博客网 时间:2024/06/03 18:17
线程状态
线程对象在不同的运行时期有不同的状态,状态信息存在于Thread.State枚举类中,每一个线程只能是下列的其中一种状态:
NEW:尚未启动的线程状态。线程实例化后还未执行start()方法时的状态。
RUNNABLE:正在执行的线程状态。
BLOCKED:等待锁的线程状态。
WAITING:等待另一个线程执行特定操作的线程状态。
TIMED_WAITING:指定了等待时间的线程状态。
TERMINATED:线程被销毁时的状态。
调用与线程有关的方法是线程状态改变的主要原因,因果关系如图:
Thread对象方法
currentThread()方法
返回当前运行的线程对象,就是代码段正在被哪个线程调用的信息。方法测试:
public class MyThread extends Thread {public MyThread() {System.out.println("MyThread:" + Thread.currentThread().getName());}@Overridepublic void run(){System.out.println("run:" + Thread.currentThread().getName());}public static void main(String[] args) {MyThread t = new MyThread();t.start();}}
返回结果:
MyThread:main
run:Thread-0
MyThread构造方法被main调用,run方法被java线程规划器调用。
isAlive()方法
判断当前的线程是否处于活动状态。线程处于正在运行或准备运行的状态(Runnable)认为是属于活动状态。使用方法:
if(mythread.isAlive()){…………};
sleep()方法
在指定的毫秒数内让当前“正在执行的线程”休眠(暂停执行),但它并不释放获取的锁资源。这个当前正在执行的线程是指this.currentThread()返回的线程。使用方法:Thread.sleep(2000);
getId()方法
取得线程的唯一标识。使用方法:mythread.getId();
Interrupt()方法
在当前线程打一个停止的标记,并不是真正的停止线程。对sleep、wait状态中的线程调用会抛出InterruptExcption与interrupted()、isInterrupted()方法配合使用
interrupted()方法
测试当前线程是否已经是中断状态,执行后将状态标志清除为false。
isInterrupted()方法
测试当前线程是否已经是中断状态,不清除状态标志。使用方法:
public class MyThread extends Thread {@Overridepublic void run(){while(true){if(this.isInterrupted()){break;}}}public static void main(String[] args) {MyThread t = new MyThread();t.start();t.interrupt();}}
holdsLock(Object obj)方法
当且仅当当前线程拥有某个具体对象的锁时返回true
stop()方法
强行终止线程。已被作废的方法,如果强制让线程停止可能让一些清理性的工作得不到完成,可能出现数据不一致等问题。使用方法:mythread.stop();
suspend()方法
将线程暂停。已被作废的方法,线程暂停不释放锁,因此可能会造成死锁。使用方法:mythread.suspend();
resume()方法
恢复线程的执行。使用方法:mythread.resume();
yield()方法
放弃当前的CPU资源,将它让给其他的任务去占用CPU执行时间,也不会释放锁资源。但放弃的时间不确定,有可能刚刚放弃又马上获得CPU时间片。使用方法:Thread.yield();
setPriority()方法
设置线程的优先级。Java中线程优先级分为1到10,10为最高。如果小于1或大于10则抛出异常IllegalArgumentExcpetion()。线程优先级具有继承性,比如A线程启动B线程,则B线程的优先级与A是一样的。使用方法:mythread.setPriority(5);
setDaemon()方法
设置线程是否为守护线程。Java线程分为用户线程和守护线程。通过Thread.setDaemon(false)设置为用户线程;通过Thread.setDaemon(true)设置为守护线程。如果不设置次属性,默认为用户线程。当进程中不存在非守护线程了,则守护线程自动销毁。方法测试:
public class MyThread extends Thread {@Overridepublic void run(){int i = 0;while(true){System.out.println(++i);}}public static void main(String[] args) {MyThread t = new MyThread();t.setDaemon(true);t.start();System.out.println("main线程结束");}}
运行结果:
main线程结束
1
2
3
4
main线程结束后守护线程销毁。
join()方法
t.join()方法阻塞调用此方法的线程,直到线程t完成,此线程再继续执行后面的代码。方法测试:
public class MyThread extends Thread {@Overridepublic void run() {for (int i = 0; i < 5; i++) {System.out.println(i);}}public static void main(String[] args) throws InterruptedException {MyThread t = new MyThread();t.start();t.join();System.out.println("main线程结束");}}运行结果:
0
1
2
3
4
main线程结束
Object对象方法
wait()方法
当前执行代码的线程进行等待,并释放锁。只能在synchronized方法或代码块中调用wait(),如果调用wait()是没有持有适当的锁,则抛出IllegalMoniterStateException。使用方法:
wait(long)方法
当前执行代码的线程进行等待,等待某一时间内是否有线程对锁进行唤醒,如果超过这个时间则自动唤醒。使用方法:Object.wait(5000);
notify()方法
随机唤醒等待队列中等待同一共享资源的一个线程,如果有多个线程等待,则有线程规划器随机挑选出一个呈wait状态的线程发出通知notify。在执行notify()方法后,当前线程不会马上释放该对象锁,要等到执行notify方法的线程将程序执行完当前线程才会释放锁。只能在synchronized方法或代码块中调用wait(),如果调用wait()是没有持有适当的锁,则抛出IllegalMoniterStateException。
notifyAll()方法
唤醒所有正在等待队列中等待同一共享资源的全部线程。
- java线程状态和线程方法
- JAVA并发-线程状态和线程组
- Java线程:线程状态
- java多线程的创建方法和线程的状态
- java线程状态转换及常用方法
- Java线程状态与方法关系
- Java多线程____线程状态Join()方法
- Java多线程____线程状态Sleep()方法
- 线程里面几个状态和方法简介
- Java线程与线程状态
- Java线程状态、线程停止、线程阻塞
- Java线程模型、线程状态 - 线程(1)
- Java线程状态、线程停止、线程阻塞
- Java 多线程、并发系列之线程定义和线程状态
- java高并发--线程状态和创建线程
- java 线程的生命周期和状态控制
- Java 线程的基本状态和操作
- Java线程的生命周期和状态控制
- 流策略概述Traffic Policy
- 1559:data2 and nba2k
- Vijos1334 NASA的食物计划
- servlet处理文件上传8
- 剑指Offer_面试题34_丑数
- java线程状态和线程方法
- DFA敏感词过滤算法
- Vijos1375 大整数
- Android okHttp网络请求之Retrofit+Okhttp+RxJava组合
- html输入框只允许输入数字及小数点
- C++拷贝构造函数详解
- poj 3368
- HDU
- 带有卫星数据的排序(使用sort)