1.Thread状态图
在调用Thread实例start()方法后,基本状态可以分为可执行(Runnable)、被阻断(Blocked)、执行中(Running),状态转移如下:
实例化Thread并start()后,线程进入Runnable(可执行)状态,此时线程尚未真正开始执行run()方法,必须等待CPU schedule(CPU 一种排班器)排入CPU执行,线程才会执行run()方法,进入Running状态。
进入Blocked状态状况:
- 调用Thread.sleep()方法
- 进入synchronized前竞争对象锁定的阻断
- 调用wait()的阻断。
- 等待输入输出完成等。。
需要注意的是:运用多线程时,当某线程进入Blocked时,让另一线程排入CPU执行,避免CPU空闲,可以有效改变效能。
如下是Thread.sleep()进入Blocked的例子,若其他线程调用该线程的方法,会抛出异常,这是让线程醒来的方式。
public class SleepInterrupt{
public static void main(String [] args){
Thread thread =new Thread(){
@Override
public void run(){
try{
Thread.sleep(9999999);
}catch(InterruptedException ex){
System.out.println("我醒了");
}
}
};
thread.start();
thread.interrupt();//主线程调用interrupt的方法
}
}
运行结果:
2.安插线程
如果A线程正在运行,流程中允许B线程加入,等到B线程执行完毕后再继续执行A线程,可以使用join()的方法来完成。
public class JoinThread{
public static void main(String [] args){
System.out.println("Main主线程开始...");
Thread thread2 =new Thread(){
@Override
public void run(){
try{
System.out.println("线程2开始...");
for(int i=0;i<10;i++){
Thread.sleep(1000);
System.out.println("线程2执行...");
}
System.out.println("线程2将结束...");
}catch(InterruptedException ex){
ex.printStackTrace();
}
}
};
thread2.start();
try{
//Thread2加入主线程中
thread2.join();
}catch(InterruptedException ex){
ex.printStackTrace();
}
System.out.println("主线程将结束...");
}
}
执行结果:
2.线程停止
java 线程的停止在如下链接有很清晰的解释
http://blog.youkuaiyun.com/anhuidelinger/article/details/11746365
本文深入探讨Java线程的基本状态管理,包括可执行、执行中、被阻断状态,以及如何通过sleep()、wait()方法使线程进入阻断状态。同时介绍线程的停止方式和线程间协作的join()方法。通过具体代码示例,展示如何有效利用多线程提升程序性能。

被折叠的 条评论
为什么被折叠?



