进程与线程
进程(process)是操作系统的任务单元,每个程序启动后,操作系统都会为其分配进程编号PID。
线程(Thread)是进程中的任务单元,程序启动的时候,首先会创建主线程,可以在主线程中开辟子线程。每一个线程都对应一个虚拟机栈,栈是线程私有的,堆和方法区是线程共享的。
串行
在一台机器上单线程执行
并行
并发:在同一台机器上多线程并行执行(存在资源竞争关系)
并行:在多台机器上并行执行(不存在资源竞争关系)
线程的五种生命周期
1.新建(new):新创建了一个线程对象。
2.可运行(runnable):线程对象创建后,当调用线程对象的start()方法,该线程处于就绪状态,等待被线程调度选中,获取cpu的使用权。
3.运行(running):可运行状态(runnable)的线程获得了cpu时间片(timeslice),执行程序代码。注:就绪状态是进入到运行状态的唯一入口,也就是说,线程要想进入运行状态执行,首先必须处于就绪状态中;
4.阻塞(block):处于运行状态中的线程由于某种原因,暂时放弃对CPU的使用权,停止执行,此时进入阻塞状态,直到其进入到就绪状态,才有机会再次被CPU调用以进入到运行状态。
阻塞的情况分两种:
1.阻塞时候释放锁2.阻塞时候不释放锁
5.死亡(dead):线程run()、main()方法执行结束,或者因异常退出了run()方法,则该线程结束生命周期。死亡
的线程不可再次复生。
Java实现多线程的方式有四种
1.继承Thread类,重写run方法
2.实现Runnable接口,重写run方法
3.实现Callable接口,重写call方法
4.线程池
java中类只能单继承,所以在一个类方便继承Thread的时候,用他继承Thread类实现多线程,否则可以实现Runnable接口来实现多线程,这两者都是没有返回值的,主线程中无法捕获子线程发生的错误。
如果实现的多线程需要返回值,那么可以实现Callable接口实现多线程,Callable需要设定一个泛型,并且可以返回值。
Thread
Runnable
Callable