1、进程和线程
1.1、进程和线程
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-hIIdLGyB-1607654523249)(C:/Users/lenovo/AppData/Roaming/Typora/typora-user-images/image-20201127095900340.png)]
1.2、并行和并发
单核cpu下,线程实际上还是串行执行的,操作系统中有一个组件,叫做任务调度器,将cpu的时间片交给不同的线程使用,只是由于cpu在线程间(时间片很短)的切换非常快,人类感觉是同时运行的。总结一句话就是:微观串行,宏观并行
一般会将这种线程轮流使用cpu的做法称为并发。
而并行是在多核cpu的情况下,可以真正的同时执行多个线程。
总结来说:
- 并发(concurrent)是同一时间应对(dealing with)多件事情的能力。
- 并行(parallel)是同一时间动手做(doing)多件事情的能力。
1.3、同步和异步
- 同步等待
/**
* 同步等待
*/
public class Sync {
public static void main(String[] args) throws InterruptedException {
System.out.println("hello");
System.out.println("world");
}
}
do other things必须等待前面操作完成
-
异步不等待
/** * 异步不等待 */ public class Async { public static void main(String[] args) { new Thread(() -> { System.out.println("hello"); },"Thread1").start(); System.out.println("world"); } }
world不必等待前面完成
多线程可以让方法的执行变成异步的(即不要干巴巴的等),比如读取磁盘文件,假设读取操作花费了5秒,如果没有线程调度技术,这5秒调用者什么也做不了,其他代码都得暂停。
结论:
- 需要等待结果返回,才能继续运行就是同步
- 不需要等到结果返回,就能继续运行就是异步
1.4、总结
1、单核cpu下,多线程不能实际提高程序运行效率,只是为了能够在不同的任务之间切换,不同线程轮流使用cpu,不至于一个线程总占用cpu,别的线程没法干活。
2、多核cpu可以并行跑多个线程,但能否提高运行效率还是要分情况的
- 有些任务,经过精心设计,将任务拆分,并行执行,当然可以提高程序的运行效率,但不是所有计算
任务都能拆分。
- 也不是所有任务都需要拆分,任务的目的如果不同,谈拆分和效率没有意义。
3、IO操作不占用cpu,只是我们一般拷贝文件使用的是【阻塞IO】,这时相当于线程虽然不适应cpu,但是
需要一直等待IO结束,没能充分的利用线程,所以才有后面的【非阻塞IO】和【异步IO】优化。