一、 并发与并行
1、并发
并发:指两个或多个事件在同一个时间段内发生
它们会交替执行
在操作系统中安装了多个程序 并发指的是在一段时间内宏观上有多个程序同时运行
在单 CPU 系统中 每一时刻只能有一道程序执行 即微观上这些程序是分时的交替运行
只不过是给人的感觉是同时运行 那是因为分时交替运行的时间是非常短的
2、并行
并行:指两个或多个事件在同一时刻发生(同时发生)
它们会同时执行
而在多个 CPU 系统中 则这些可以并发执行的程序便可以分配到多个处理器(CPU)上 从而实现多任务并行执行
即利用每个处理器来处理一个可以并发执行的程序 这样多个程序便可以同时执行
目前电脑市场上说的多核CPU便是多核处理器 核越多 并行处理的程序越多 这能大大的提高电脑运行的效率
二、线程与进程
1、进程
进程是指一个进入到内存中运行的应用程序 每个进程都有一个独立的内存空间 一个应用程序可以同时运行多个进程
进程也是程序的一次执行过程 是系统运行程序的基本单位
系统运行一个程序即是一个进程从创建 运行到消亡的过程
2、线程
线程是进程中的一个执行单元 负责当前进程中程序的执行 一个进程中至少有一个线程
一个进程中是可以有多个线程的 这个应用程序也可以称之为多线程程序
即 一个程序运行后至少有一个进程 一个进程中可以包含多个线程
三、线程调度
1、分时调度
所有线程轮流使用 CPU 的使用权 平均分配每个线程占用 CPU 的时间
2、抢占式调度(Java使用此方式)
优先让优先级高的线程使用CPU
如果线程的优先级相同 那么会随机选择一个(线程的随机性)
若优先级越高 则抢夺cpu的执行几率越大
大部分操作系统都支持多进程并发运行 现在的操作系统几乎都支持同时运行多个程序
例:一边使用编辑器 一边使用录屏软件 同时还开着画图板 dos窗口等软件
此时 这些程序是在同时运行 但是感觉这些软件好像在同一时刻运行着
实际上 CPU(中央处理器)使用抢占式调度模式在多个线程间进行着高速的切换
对于CPU的一个核而言 某个时刻只能执行一个线程 而 CPU的在多个线程间切换速度相对我们的感觉要快 看上去就是在同一时刻运行
其实 多线程程序并不能提高程序的运行速度 但能够提高程序运行效率 让CPU的使用率更高
四、创建线程类
1、单线程
在main方法中依次执行
public class Person {
private String name;
public void run()
{
// 定义循环 执行20次
for (int i=0;i<20;i++)
{
System.out.println(name+"第"+i+"次");
}
}
//省略构造方法和get set方法
}
public static void main(String[] args) {
Person person1=new Person("一号机器人");
person1.run();
Person person2=new Person("二号机器人");
person2.run();
}
JVM(Java虚拟机)执行main方法 main方法会进入到栈内存
JVM会找操作系统开辟一条main方法通向cpu的执行路径
cpu就可以通过这个路径来执行main方法
而这个路径有一个名字 叫main线程(主线程)
单线程程序的弊端:一旦某个位置出现异常 则下面的语句都不会被执行
2、多线程
①、创建多线程程序的第一种方式
Java使用 java.lang.Thread
类代表线程 所有的线程对象都必须是Thread类或其子类的实例
每个线程的作用是完成一定的任务 实际上就是执行一段程序流 即一段顺序执行的代码
Java使用线程执行体来代表这段程序流
通过继承Thread类来创建并启动多线程
步骤:
1. 定义Thread类的子类,并重写该类的run()方法
该run()方法的方法体就代表了线程需要完成的任务 因此把run()方法称为线程执行体
2. 创建Thread子类的实例,即创建了线程对象
3. 调用线程对象的start()方法来启动该线程
线程类:
public class MyThread extends Thread {
@Override
public void run() {
// 设置线程任务
for (int i=0;i<20;i++)
{
System.out.println("run()第"+i+"次");