线程的状态和方法

时间:2022-06-03 08:22:14

虚拟机中的线程状态有六种,定义在Thread.State():

t1.getState():查看当前线程状态。

1、新建状态NEW,比如"Thread t = new Thread()

2、可运行状态RUNNABLE,调用start()方法

3、阻塞BLOCKED,正在等待监视器锁,以便进入一个同步的块/方法,

4、等待WAITING,Object的wait()方法、Thread的join()方法、LockSupport的park()方法

5、超时等待TIMED_WAITING,调用带超时的wait(3000), join() , park() 方法

6、终止状态TERMINATED,run()方法执行结束

 

Thread中的实例方法:

1、start(),

2、run()、

3、isAlive(),保证线程执行完成。

1
2
Thread.sleep( 100 ); //睡眠0.1s保证mt中的线程执行完。
System.out.println( "end == "  + mt.isAlive());

4、getId(),有一个long型的全局唯一的线程ID生成器threadSeqNumber

5、getName(),默认以"Thread-threadInitNum"的方式来命名新生成的线程,setName

6、getPriority(),默认setPriority(5)

7、isDaeMon、setDaemon(boolean on),一种是用户线程,一种是守护线程

1
2
3
4
5
6
7
TestThread1 mt =  new  TestThread1();
mt.setDaemon( true ); //设置为守护线程,5s后必定结束。
mt.start();
Thread.sleep( 5000 );
mt.join(); //等待线程销毁时,再执行后面代码。main线程就会无限期阻塞直到mt的run()方法执行完毕,内部调用的是wait()方法。
mt.interrupt(); //未阻塞,不起作用。
System.out.println( "我离开thread对象再也不打印了,我停止了!" );
<wiz_tmp_tag class="wiz-block-scroll">
 

8、interrupt(),阻塞时抛出一个中断信号,这样线程就退出阻塞状态,没有被阻塞的线程,调用interrupt()方法是不起作用的?

9、isInterrupted(),测试线程是否已经中断,但不清除状态标识

10、join(),是等待线程销毁。

       join(2000)表示调用join()方法所在的线程最多等待2000ms,执行过程中会释放锁;

 

Thread中的静态方法:

1、currentThread(),返回的是对当前正在执行线程对象的引用。

2、sleep(long millis),在指定的毫秒内让当前"正在执行的线程"(Thread.currentThread())休眠(暂停执行)

3、yield(),暂停当前执行的线程对象,并执行其他线程。这个暂停是会放弃CPU资源的,并且放弃CPU的时间不确定。run中执行yield(),退出时间不确定。

4、interrupted(),测试当前线程是否已经中断,执行后具有将状态标识清除为false的功能。

 

 

1、线程类的构造方法、静态块是被main线程调用的;

2、而线程类的run()方法才是应用线程自己调用的

 

1、this.XXX()

这种调用方式表示的线程是线程实例本身,在main函数中为Thread_0 ;

2、Thread.currentThread.XXX()或Thread.XXX()

这种调用方式表示的线程是正在执行Thread.currentThread.XXX()所在代码块的线程 ;

3、当前执行的Thread未必就是Thread本身 ;

 

sleep(2000)不释放锁,join(2000)释放锁:

1、join(2000)即最多等待2s,通过不断轮询,查看线程是否活动,销毁后理解释放锁;

2、join()=join(0)是不断的询问线程的状态,直到线程销毁join()方法才会结束;

3、sleep是native方法,等待时间结束后才释放锁,与线程状态无关。

 

Thread类中run()和start():
run()方法:在本线程内调用该Runnable对象的run()方法,可以重复多次调用,不是启动线程,只是普通调用方法,自动等待调用结束执行后面代码;
start()方法:启动一个线程,调用该Runnable对象的run()方法,不能多次启动一个线程;

 

两个线程调用状态:

创建后,进入new状态;

调用start方法后,进入runnable状态。

wait()方法对应的线程调用Sleep方法,进入timed_waiting状态;

wait()方法释放锁,进入waiting状态:

notify()方法不释放锁,wait对应的线程进入blocked状态,等待notify对应的线程运行结束,wait对应的线程进入runnable状态;

wait线程执行完毕,进入terminated状态。