线程的状态
线程有六种状态:
1. 创建:调用了new Thread(),尚未start()之前
2. 就绪:调用了start(),在内存中准备就绪,等待获取cpu
3. 运行:获取了cpu
4. 阻塞:暂时释放了cpu资源,可能释放了同步锁(sleep()释放了cpu,但是持有同步锁;wait()释放了cpu和同步锁)
5. 终止:run()代码执行完毕或程序异常退出(如手动将进程杀死)
状态之间的转换
线程的相关函数详解
wait()/wait(long)/wait(long,int):线程等待,是object的方法,在函数中调用,意为释放当前线程所持有的CPU和同步锁,进入等待状态
notify()/notifyAll():和wait()匹配使用,是object的方法,用于唤醒处于该对象监视器下的线程。notify()随机唤醒任一线程;notifyAll()唤醒该对象监视器下的所有线程。
sleep()/sleep(long)/sleep(long,int):线程休眠,属于Thread的方法。暂时释放CPU,但是会继续持有对象的同步锁。
join():等待该线程(调用了join()的线程)执行完毕,再执行当前线程(调用了Thread.join()方法所在的线程)。Thread方法,调用了wait()方法。
线程的实现方式
继承Thread
1.继承Thread
class TestThread extends Thread{
@Override
public void run() {
super.run();
}
}
2.调用Thread.start()
TestThread testThread = new TestThread();
testThread.start();
实现Runnable
1.实现runnable
class TestRunnable implements Runnable{
@Override
public void run() {
}
}
2.调用new Thread(new Runnable()).start()
new Thread(new TestRunnable()).start();
问:start()和run()有什么区别?
start()意为启动一个线程;然后在线程中再调用run()方法。而单独调用run()方法仅是执行了一块代码块,并不能实现子线程效果。