虚拟机中的线程状态有六种,定义在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对象再也不打印了,我停止了!"
);
|
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状态。