多线程与线程池
名词解释
- 进程(process):计算机已运行程序的实体。程序本身只是指令、数据及其组织形式的描述,进程才是程序(那些指令和数据)的真正运行实例。用户下达运行程序的命令后,就会产生进程。同一程序可产生多个进程(一对多关系),以允许同时有多位用户运行同一程序,却不会相冲突。进程是拥有资源的基本单位。进程需要一些资源才能完成工作,如CPU使用时间、存储器、文件以及I/O设备,且为依序逐一进行,也就是每个CPU核心任何时间内仅能运行一项进程。进程之间是资源隔离的,如果在进程间共享内容/消息传递代价较大。
- 线程:进程中负责程序执行的执行单元,线程是独立调度(CPU调度)和分派的基本单位,OS做调度时处理的是线程。一个进程中至少有一个线程,每个线程执行的都是进程代码中的某个片段。每个线程都拥有单独的栈内容来做存储本地数据。
- Java有没有多进程编程?否!java程序运行在JVM中,JVM本身就是java.exe运行起来,所以对OS而言,JVM是一个进程,其中无法进行多进程编程。
- 多线程:多条线程同时存在,例如写word时,一边输入一边自动保存,就需要两条线程来分别完成。关键技术:线程间通信,线程间共用资源。
- 线程池:一种线程使用模式。使用少量线程并让线程保持忙碌。以避免每个用户的请求都反复创建线程的开销。当线程池的线程刚创建时,让他们进入阻塞状态,等到任务来了唤醒即可。可用线程数量应该取决于可用的并发处理器、处理器内核、内存、网络sockets等的数量。
有关线程你该知道的
创建线程的两种方式:
- 继承Thread类,扩展线程;
- 实现Runnable接口,java不支持多类继承,所以要继承其他类时调用Runnable接口更好。
具体代码及解释参考文首孙富生简书链接。
Thread类中的start()和run()方法区别
- 调用run()方法,用当前线程去执行一个普通方法,并没有创建新线程;
- 调用start()方法才会启动新线程,该方法会做一些准备工作:设置好这个线程的上下文,比如这个线程的栈(用于函数调用),线程的状态,这个线程的PC(Program Counter)等等一系列信息以后,这个线程才可以被调度,一旦被调度,就会执行那个run()方法了。