1、什么是线程和进程
程序:开发写的代码
进程:将程序运行起来,一个应用程序(一个进程是一个软件)
线程:线程是进程中的实际运作的单位,是程序的实际执行者,是最小的执行单位
2、线程和进程的关系
线程是进程中的实际运作的单位
进程和进程之间堆内存和方法区共享,栈内存独立不共享
一个进程可以启动多个线程
3、并发、并行、串行
并发:同一个对象被多个线程同时操作
并行:多个任务同时进行(必须多核)
串行:一个接着一个进行,程序处理完当前进程,按顺序处理下一个进程
4、进程的三种状态
就绪态:当进程获取出CPU外所有的资源后,只要再获得CPU就能执行程序时
运行态:当进程已获得CPU操作权限,正在运行时
阻塞态:正在执行的进程,等待某个事件而无法继续运行时被系统剥夺了CPU的操作权限时
5、线程的状态
新建状态(NEW)
线程已创建,尚未调用start()方法启动前。
运行状态(RUNNABLE)
线程对象被创建后,调用该对象的start()方法,并获取CPU权限进行执行。
阻塞状态(BLOCKED)
线程在获取synchronized同步锁失败
等待状态(WAITING)
正在等待另一个线程执行特定动作来唤醒该线程的状态
超时等待状态(TIME_WAITING)
有明确结束时间的等待状态
终止状态(TERMINATED)
线程结束完成后
6、线程的实现方法
(1)继承Thread类
【1】自定义线程类继承Thread类
【2】重写run()方法,编写线程执行体
【3】创建线程对象,调用start()方法启动线程(启动后不一定立即执行,抢到CPU资源才能执行)
// 自定义线程对象
public class MyThread extends Thread {// (1)继承Thread
public MyThread(String name){//有参构造
super(name);
}
@Override
public void run() {// (2)重写run()方法
//循环10次
for (int i = 0; i < 10; i++) {
System.out.println(Thread.currentThread().getName() + "——" + i);
}
}
public static void main(String[] args) {// main线程,主线程
// 创建线程实现类的对象
MyThread thread1 = new MyThread("线程1");
MyThread thread2 = new MyThread("线程2");
// (3)调用start()方法启动线程
thread1.start();
thread2.start();
for (int i = 0; i < 10; i++) {
System.out.println("主线程——" + i);
}
}
}
(2)实现Runnable接口
【1】自定义线程类实现Runnable接口
【2】实现run()方法,编写线程体
【3】创建线程对象,调用start()方法启动线程(启动后不一定立即执行,抢到CPU资源才能执行)
// 自定义一个线程对象
public class MyRunnable implements Runnable {// (1)实现Runnable接口
@Override
public void run() {// (2)重写run()方法
//循环10次
for (int i = 0; i < 10; i++) {// 线程执行体
System.out.println(Thread.currentThread().getName() + "——" + i);
}
}
public static void main(String[] args) {// main线程,主线程
// 创建实现类对象
MyRunnable myRunnable = new MyRunnable();
// 创建代理类对象
Thread thread1 = new Thread(myRunnable,"线程1");
Thread thread2 = new Thread(myRunnable,"线程2");
// (3)调用start()方法启动线程
thread1.start();
thread2.start();
for (int i = 0; i < 10; i++) {
System.out.println("主线程——" + i);
}
}
}
(3)实现callable接口【不常用】
【1】实现Callable接口
【2】重写call()方法
【3】创建目标对象
【4】创建执行服务
【5】提交执行
【6】获取结果
【7】关闭服务
(4)通过线程池创建
优势:
降低资源消耗、提高响应速度、拥有更多的功能