一.线程的相关概念与理解
参考笔记: 进程、线程的理解
二.线程的五种状态
1.新建:创建过程
2.就绪状态:创建好了,可以运行了
3.运行状态:代码处理逻辑正在运转中
4.死亡状态:逻辑执行完了,主动死亡;或者出现异常问题,被动死亡。
5.阻塞状态:其实就是暂停,因为一些原因需要暂停逻辑执行,可能的情况有:
1)主动暂停,sleep()睡眠指定的一段时间,睡完继续执行代码逻辑
2)被动暂停,需要调用的资源被其它线程占了,或者资源正在分配中,没办法只能等待;
或者互斥锁被其它线程占有,等待获得互斥锁拥有权(若把锁也看做一种资源,广义来看,还是资源被占)。
线程状态具体参考剪藏:
线程的五大状态 - peter_teng的专栏 - 博客频道 - CSDN.NET
在Java中对应的状态转换图:
三.创建Java线程的三种方式:
&&.1、calss MyThread extends Thread
构造方法:
new MyThread();
new MyThread( String name ); //指定名称,可通过getName()方法,获取传入的name值。
启动方法:
start() : 会触发Thread的生命周期,注意,一个线程对象只能调用一次start()方法,在生命周期未结束前,多次调用会报错。
&&.2、calss MyRunnable implements Runnable
个人感觉:Runnable方式一大用处是,若想把线程执行的逻辑写在某个类中,但该类本身已经有父类时,此时该类无法再继承Thread类,但可以引用Runnable接口呀。因为Java类只能有一个父类,但可以引用自多个接口。
(java类只能extends一个父类,可以implements多个接口,java接口可以extends多个其它接口)
Java中Thread类本身就implements Runnable接口,其run()也是继承自Ruannable接口。
相关源码:
Runnable接口中的run():
public interface Runnable {
public abstract void run();
}
Thread类中的run():
@Override
public void run() {
if (target != null) {
target.run();
}
}
创建过程:
1. MyRunnable myRunnable = new MyRunnable();//创建一个Runnable线程实例
2. Thread thread = new Thread( myRunnable );//创建一个Thread对象,上面的Runnable线程实例作为target传入Thread对象
//根据Thread类run()的源码,上面thread.run()会触发myRunnable.run()
&&.3、使用Callable和FutureTask创建线程(好处在于可以获取返回的线程执行结果)
简单说明:
开发者可以在Callable实例的call()方法中写返回值,这个返回值可以通过包装它的FutureTask实例获取到。
具体依赖与包装关系为:
FutureTask实例能够包装Callable实例。