并发和并行
- 并发
并发指的是在同一个时间段发生,即交替执行。例如单核CPU一次只能处理一个程序,但是为什么我们可以在使用IntelliJ IDEA写代码的同时又可以使用QQ音乐播放音乐呢?因为这两个程序微观上在执行时是交替执行,只不过交替的时间非常短(毫秒级),我们感觉是同时在执行,实际上是并发。单核CPU不能并行处理多个任务,只能是多个任务在单个CPU上并发运行。 - 并行
并行指的两个或者多个事件在同一时刻发生,即同时执行 。在多核CPU系统中,并发的程序可以分配到不同的CPU上,实现多任务同时执行,即利用每个处理器来处理一个可以并发执行的程序,这样多个程序便可以同时执行。目前的计算机绝大多数都是多核CPU,核心越多,并行处理的程序越多,能大大提高电脑的运行效率。
CPU信息
进程和线程
- 进程
进程是程序的一次执行过程,是系统运行程序的基本单元,系统运行一个程序既是一个进程从创建、运行到消亡的过程。每个进行都拥有一个独立的内存空间,一个应用程序可以运行多个进程(例如QQ就可以登录多个账号)
Windows任务管理器中可以查看到当前系统运行的进程 - 线程
线程是进程的执行单元,负责当前进程中的任务执行,一个进程中至少会有一个线程。但是通常都是一个进程有多个线程,这样的应用程序称为多线程应用程序。每个线程都有独立的栈空间
一个Java程序就是一个进程,而一个进程一次只能执行一个线程,因此Java程序只有高并发,没有高并行。即多个线程交替执行,没有同时执行。
Java程序运行时,内部同时有多条线程,而此时需要一个线程调度机制,Java线程的调度机制是抢占式调度:优先让优先级高的线程使用CPU,如果线程的优先级相同,那么会随机选择一个线程执行。
创建线程的两种方式
在Java中java.lang.Thread类表示线程。如果想要创建线程就需要创建Thread类的对象
- 继承Thread类,重写run()方法
PrintThread继承了java.lang.Thread,并且重写任务的方法
@Log4j2注解主要用于日志记录,通过由于log42.xml文件中配置了控制台输出的日志会打印线程信息,因此在程序运行时可以看到当前运行的线程名称。
/** 自定义线程类PrintThread */@Log4j2class PrintThread extends Thread { /** 重写父类的run()方法 run()方法就是线程执行的任务 */ @Override public void run() { for (int i = 0; i < 10; i++) { //PrintThread的run方法打印i的值 log.info("Print Thread i = "+i); } }}
然后在单元测试方法中创建线程对象,调用start()方法启动线程执行线程的任务。
而且主线程中也有和PrintThread一样的任务在执行。
/** * 线程创建的方式1 继承Thread类重写run()方法 */ @Test public void te