线程概述
进程和线程
线程的生命周期
线程常用方法归纳
多线程的实现方法
案例
1. 继承Thread类,重写run方法来实现多线程
2.继承Runnable接口实现多线程
继承Thread类和实现Runnable接口完成多线程的区别
3. 通过Callable 和 FutureTask创建线程
4. 通过线程池实现多线程
关于线程注意事项
利用多线程技术可以使系统同时运行多个程序块,缩短出程序响应的时间,提高计算机资源的利用率,达到多任务处理的目的。
进程是程序的一次动态执行过程,每个进程都有自己独立的内存空间。一个应用程序可以同时启动多个进程(比如浏览器可以开多个窗口,每个窗口就是一个进程)
多进程操作系统能够运行多个进程,每个进程都能够循环利用所需要的CPU时间片,使得所有进程看上去像在同时运行一样。
线程是进程的一个执行流程,一个进程可以由多个线程组成,也就是一个进程可以同时运行多个不同的线程,每个线程完成不同的任务。
线程的并发运行:就是一个进程内若干个线程同时运行。(比如:word的拼写检查功能和首字母自动大写的功能是word进程中的线程)
线程和进程的关系是一个局部和整体的关系,每个进程都由操作系统分配独立的内存地址空间,而同一进程的所有线程都在同一地址空间工作。
一个线程的完整生命周期要经历5种状态:新建、就绪、运行、阻塞、死亡
新建状态:使用new和某种线程的构造方法来创建线程对象,该线程就会进入新建状态,系统为该线程对象分配内存空间。处于新建状态的线程可以通过调用**start()**方法进入就绪状态。
就绪状态:此时线程已经具备了运行的条件,进入了线程队列,等待系统分配CPU资源,一旦获得CPU资源,该线程就会进入运行状态。
运行状态:进入运行在状态,线程会执行自己的**run()**方法中的代码。
阻塞状态:一个正在执行的线程,如果执行了suspend、join或sleep方法,或等待io设备的使用权,那么该线程将会让出自己的CUP控制权并暂时中止自己的执行,进入阻塞状态。阻塞的线程,不能够进入就绪队列,只有当阻塞原因被消除的时候,线程才能进入就绪状态,重新进入线程队列中排队等待CPU资源,然后继续执行。
死亡状态:一个线程完成了全部工作或者被提前强制性的中止,该线程就处于死亡状态。
运行结果:(基于4核计算机)
运行三个线程(顺序执行)
运行6个线程(交互执行)
实现Runnable接口可以做到资源共享,而继承Thread类不行(比如购票问题)
实现Runnable接口相比继承Thread类来说,具有两大优势:避免单继承带 来的局限和可以共享资源等优势
相比Thread类的继承,一般采用实现Runnable接口来实现多线程
3.1 创建Callable接口的实现类 ,实现它的Call方法
3.2 使用FutureTask类来包装Callable对象,这个FutureTask对象需要封装Callable对象的Call方法的返回值
3.3 使用FutureTask对象作为Thread对象的target创建并调用start方法启动线程
java中,所有线程都是同时启动的,哪个线程占有CPU等运行资源,哪个线程就可以运行。
Java程序每次运行都需要启动两个线程(main线程和垃圾收集器线程)
Java线程运行过程中,其他线程并不会随着主线程的结束而结束
版权所有© 帮我毕业网 并保留所有权利