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()方法

在当前线程打一个停止的标记,并不是真正的停止线程。对sleepwait状态中的线程调用会抛出InterruptExcptioninterrupted()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中线程优先级分为11010为最高。如果小于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()方法

唤醒所有正在等待队列中等待同一共享资源的全部线程。

原创粉丝点击