要开始了解多线程的知识我们先得理解线程是什么?线程和进程之间关系?
线程是什么?
线程是程序的一个指令序列,具有传统进程所具有的特征,故又称为轻型进程或进程元。线程一般包含于进程当中,一个进程可能有一个或多个线程。
线程和进程的区别?
进程是操作系统资源分配的基本单位,线程是处理器任务调度和执行的基本单元。
资源方面:每个进程都有独立的代码和数据空间,程序间的切换会有较大开销;线程因为是轻量级进程,每一个线程都有自己运行栈和程序计数器,切换开销较小。
内存分配:统一进程的线程共享本进程的地址空间和资源,而进程之间的地址空间和资源是相互独立的。
影响关系:一个进程崩溃后,在保护模式下不会对其他进程造成影响。但是一个线程崩溃往往会引起一整个进程都死掉。
执行过程:每个独立的进程都有程序运行的入口,顺序执行序列和程序出口。但是线程不能独立执行,必须依靠应用程序,由其提供多个线程执行控制,两者均可并发执行。
创建多线程的三种方式
1)继承Thread类的方式创建多线程
编写简单,直接继承即可,访问当前线程只需要调用this指针。但是继承Thread类无法再去继承其他父类。
代码示例:
public class Test extends Thread{//继承Thread类
public void run(){//重写run方法
}
}
public class Main {
public static void main(String[] args){
new Test().start();//创建并启动线程
}
}
2)采用实现Runnable接口实现多线程
线程可以继承其他父类或者其他接口,更为灵活。但是编程复杂,访问当前进程,需要使用Thread.currentThread()方法。
代码示例:
public class Test2 implements Runnable {//实现Runnable接口
public void run(){//重写run方法
}
}
public class Main {
public static void main(String[] args){
//创建并启动线程
Test myThread=new Test();
Thread thread=new Thread(Test);
thread().start();
//或者 new Thread(new Test()).start();
}
}
3)使用Callable接口创建多线程(不常用)
与Runnable相似,不过继承的Callable会有一个功能更为强大的call()方法,可以有返回值,且能抛出异常。我自己也没用过。
线程的状态
线程的生命周期及五种基本状态
1)新建状态(new):当线程对象创建后,就进入了新建状态。如:Thread t =new Thread();
2)就绪状态(Runnable):当调用线程对象的start()方法(t.start()),线程就进入就绪状态。注意,线程进入就绪状态只是说明线程做好了准备,等待cpu调度,不代表立马执行。
3)运行状态(Running):当cpu开始调度处于就绪状态的线程时,此时线程进入运行状态。就绪状态是进入运行状态的唯一入口,意思想进入运行状态,首先必须处于就绪状态中。
4)阻塞状态:处于运行状态中的线程由于某种原因,暂时放弃对cpu的使用权,停止执行,此时进入阻塞状态,直到进入到就绪状态,才有机会进入到运行状态。分为三种:
1.等待阻塞:运行状态中的线程执行wait()方法,使本线程进入到等待阻塞状态;
2.同步阻塞:线程在获取synchronize同步锁失败(因为锁被其他线程占用),它会进入同步阻塞状态;
3.其他阻塞:通过调用线程的sleep()或join()或发出了io请求,线程会进入阻塞状态。这种情况 当三种状态结束后会自动转入就绪状态。
5)死亡状态(Dead):线程执行完了或者因异常退出了run()方法,该线程结束生命周期。