线程管理
根据 Java 并发编程(二)线程状态跃迁可知线程包含了如下几种状态:
1.新建状态(New)
2.就绪状态(Runnable)
3.运行状态(Running)
4.阻塞状态(Blocked)
5.死亡状态(Dead)
Java中自带了对多线程技术的支持,实现多线程编程方式有两种,一种是继承Thread类,另一种是实现Runnbale接口。
1 继承Thread类
在学习创建线程前,先看看Thread类的结构,如下:
public class Thread implements Runnable {}
Thread类实现了Runnable接口,它们之间存在多态关系。使用继承Thread类创建线程局限就是不能多继承,这是因为Java语言特点就是单继承。所以为了实现多继承,可以实现Runnable接口的方式创建线程。两种方式(一边实现一边继承)创建的线程工作性质是一致的,没有本质区别。
创建自定义线程类如下:
public class MyThread extends Thread{
@Override
public void run() {
try {
// 阻塞状态(Blocked)
TimeUnit.SECONDS.sleep(4);
System.out.println("MyThread");
} catch (Exception e) {
e.printStackTrace();
}
}
}
调试代码如下:
public class Run {
public static void main(String[] args) {
// 新建状态(New)
MyThread thread = new MyThread();
// 就绪状态(Runnable),由CPU调度是状态转为:运行状态(Running)
thread.start();
System.out.println("Main线程运行结束");
}
}
执行结果:
Main线程运行结束
MyThread // 死亡状态(Dead),已退出run()方法
从结果上看,MyThread类中的run方法执行比较晚,也说明在多线程中,各线程之间执行顺序与调用顺序无关。同样,线程其实是一个子任务,CPU的任务调度是不确定的方式或者说是随机来调用线程并执行run方法,所以就会出现此结果。
2 实现Runnable接口
Java不支持多继承,如果要创建的线程已经继承某各类,那就不能在继承Thread类创建线程类了,所以此时只能实现Runnable接口来创建线程类。
创建自定义线程类:
public class MyRunnable implements Runnable {
@Override
public void run() {
System.out.println("MyRunnable");
}
}
调试代码:
public class Run {
public static void main(String[] args) {
MyRunnable myRunnable = new MyRunnable();
Thread thread = new Thread(myRunnable);
thread.start();
System.out.println("Main线程运行结束");
}
}
调试结果:
Main线程运行结束
MyRunnable
3 小结
Java中创建线程类还是比较简单的,但是多线程之间的同步确实比较难理解以及如何实现同步可参考如下文章:Java 并发编程(四)线程同步关键字volatile和synchronized