并发:两个或多个事件在同一个时间段内发生
并行:两个或多个事件在同一个时间点发生
进程:进入到内存中的程序,是指一个内存中运行的应用程序,每个进程都有一个独立的内存空间,一个应用程序可以同时运行多
个进程;进程也是程序的一次执行过程,是系统运行程序的基本单位;系统运行一个程序即是一个进程从创
建、运行到消亡的过程。
线程:线程是进程中的一个执行单元,负责当前进程中程序的执行,一个进程中至少有一个线程。一个进程
中是可以有多个线程的,这个应用程序也可以称之为多线程程序。
简而言之:一个程序运行后至少有一个进程,一个进程中可以包含多个线程
线程调度:
分时调度,所有线程轮流使用 CPU 的使用权,平均分配每个线程占用 CPU 的时间。
抢占式调度,优先让优先级高的线程使用 CPU,如果线程的优先级相同,那么会随机选择一个(线程随机性),Java使用的为
抢占式调度。
创建多线程的方式:
继承Thread类:重写Thread类的run()方法,在run()方法里添加要执行的任务,
使用:新建子类对象,用子类对象调用Thread类的start()的方法来执行run()方法,start()开辟一个新的线程,在此线程里面执行run()方法
Java中通过继承Thread类来创建并启动多线程的步骤如下:
1. 定义Thread类的子类,并重写该类的run()方法,该run()方法的方法体就代表了线程需要完成的任务,因此把
run()方法称为线程执行体。
2. 创建Thread子类的实例,即创建了线程对象
3. 调用线程对象的start()方法来启动该线程
代码如下:
测试类:
自定义线程类:
public class Demo01 {
public static void main(String[] args) {
//创建自定义线程对象
MyThread mt = new MyThread("新的线程!");
//开启新线程
mt.start();
//在主方法中执行for循环
for (int i = 0; i < 10; i++) {
System.out.println("main线程!"+i);
}
}
}
public class MyThread extends Thread {
//定义指定线程名称的构造方法
public MyThread(String name) {
//调用父类的String参数的构造方法,指定线程的名称
super(name);
} /
**
/**
* 重写run方法,完成该线程执行的逻辑
*/
@Override
public void run() {
for (int i = 0; i < 10; i++) {
System.out.println(getName()+":正在执行!"+i);
}
}
}
实现Runnable接口方式创建多线程:
1、创建一个实现Runnable接口的实现类
2、在实现类中重写Runnable接口的run()方法,在run()方法中设置线程任务
3、创建Runnable接口的实现类对象
4、创建Thread类对象,构造方法中传递Runnable接口的实现类对象
5、调用Thread类中的start()方法,开启新的线程执行run()方法
两种方式区别:
匿名内部类方式实现多线程的创建:
1、new Thread()方式
2、new Runnable()接口方式
3、简化匿名内部类方式