线程状态
线程生命周期,总共有五种状态:
1.新建状态(New):当线程对象对创建后,即进入了新建状态,如:Thread t = new MyThread();
2.就绪状态(Runnable):当调用线程对象的start()方法(t.start();),线程即进入就绪状态。处于就绪状态的线程,只是说明此线程已经做好了准备,随时等待CPU调度执行,并不是说执行了t.start()此线程立即就会执行;
3.运行状态(Running):当CPU开始调度处于就绪状态的线程时,此时线程才得以真正执行,即进入到运行状态。注:就绪状态是进入到运行状态的唯一入口,也就是说,线程要想进入运行状态执行,首先必须处于就绪状态中;
4.阻塞状态(Blocked):处于运行状态中的线程由于某种原因,暂时放弃对CPU的使用权,停止执行,此时进入阻塞状态,直到其进入到就绪状态,才有机会再次被CPU调用以进入到运行状态;
5.根据阻塞产生的原因不同,阻塞状态又可以分为三种:
a) 等待阻塞:运行状态中的线程执行wait()方法,使本线程进入到等待阻塞状态;
b) 同步阻塞:线程在获取synchronized同步锁失败(因为锁被其它线程所占用),它会进入同步阻塞状态;
c) 其他阻塞:通过调用线程的sleep()或join()或发出了I/O请求时,线程会进入到阻塞状态。当sleep()状态超时、join()等待线程终止或者超时、或者I/O处理完毕时,线程重新转入就绪状态。
6.死亡状态(Dead):线程执行完了或者因异常退出了run()方法,该线程结束生命周期。
Thread
类
- 源码摘抄
public class Thread extends Object implements Runnable
- 构造方法
-Thread() 分配新的 Thread 对象。 -Thread(String name) 分配新的 Thread 对象。 -Thread(Runnable target) 分配新的 Thread 对象。 -Thread(Runnable target, String name) 分配新的 Thread 对象。
- 常用方法
-static Thread currentThread()返回对当前正在执行的线程对象的引用。 -long getId()返回该线程的标识符。 -String getName() 返回该线程的名称。 -void run() 如果该线程是使用独立的 Runnable 运行对象构造的 -static void sleep(long millis) 在指定的毫秒数内让当前正在执行的线程休眠 -void start() 使该线程开始执行;Java 虚拟机调用该线程的 run 方法。 -void stop()已过时。 终止线程。
- 测试
//这个类用来测试多线程编程的实现方式1 extends Thread public class Test2_Thread { public static void main(String[] args) { //3、让多个线程执行run()的业务 //7、"钢铁侠""美队"是自定义的线程名称,自动匹配了含参构造 MyThread thread = new MyThread("钢铁侠"); //新建状态 //4、启动线程 //start()从新建状态变成可运行状态,自动调用run() thread.start(); MyThread thread2 = new MyThread("美队"); //新建状态 thread2.start(); //6、start()和run()都能执行业务,run()只是一个普通的实现方式,并没有多线程编程的特点 // thread2.run(); //5、多线程执行具有随机性,结果不能保证 // Thread-1===0 // Thread-0===0 // Thread-1===1 // Thread-0===1 } } //1、创建多线程类MyThread 继承Thread类 class MyThread extends Thread{ //6、修改线程名称Thread(String name) //使用了父类中构造方法的业务,右键 -- source -- 倒数第二个 -- 选择你想用的 -- ok public MyThread() { super(); } public MyThread(String name) { super(name); } //2、把多线程业务的代码放入run() @Override public void run() { //默认在子类中调用父类的功能,通过super关键字 //super.run(); for(int i = 0 ; i<10 ;i++) { //getName()获取线程名称 System.out.println(getName()+"==="+i); } } }
Runnable
接口
- 源码摘抄
public interface Runnable
- 接口里面没有构造方法,不能直接
new
- 常用方法
void run
- 测试
//这个类用来测试多线程编程方式2 实现Runnable接口 public class Test3_Runnable { public static void main(String[] args) { //3、创建多个线程对象执行任务? MyRunnable my = new MyRunnable(); //把接口类型的对象,转成Thread类型,因为想调用Thread的start()启动线程--Thread(Runnable target) //"jack""rose"是自定义的线程名称 Thread thread = new Thread(my,"jack"); //4、调用start()启动线程 thread.start(); Thread thread2 = new Thread(my,"rose"); thread2.start(); } } //1、创建实现类 实现Runnable接口 class MyRunnable implements Runnable{ //2、把多线程的业务放在run() @Override public void run() { for (int i = 0; i < 10; i++) { //Thread.currentThread()获取当前正在执行任务的线程对象 System.out.println(Thread.currentThread().getName()+"----"+i); } } }