进程、线程、多线程概念
目录
进程
进程是一个动态概念,当我们启动一个应用的时候,就启动了一个进程。关闭一个应用时,进程即结束。
线程
线程是组成进程的基本单位,一个进程由一个或多个线程组成。线程与进程都是动态的。
区别
1.包含关系,进程中有线程。
2.进程拥有独立的运行内存空间,每个进程所占内存空间都是独立的,互不干扰。
3.线程是共享内存空间的,但每个线程的执行都是独立的。
4.单独的线程无法运行,需要由进程控制。
多线程
多线程是指在一个进程中,多个线程同时执行,但并不是真正意义上的同时执行。
系统会为每个线程分配CPU资源,在某个时间段内CPU会被一个线程占用,因此不同时间段是由不同线程占用。只是由于CPU运行速度快,因此难以察觉线程在交替运行,让我们感觉在同时执行
线程的基础使用
1.继承Thread类
创建自定义类继承Thread类,并重写run方法中的业务逻辑。run方法中的东西可理解为“任务”。
public class MyThread extends Thread {
@Override
public void run() {
// TODO Auto-generated method stub
//定义业务逻辑
for (int i = 0; i < 1000; i++) {
System.out.println("--------MyThread");
}
}
}
public class Test {
public static void main(String[] args) {
MyThread myThread1 = new MyThread();
myThread1.start();
}
}
注意:不能使用run方法来调用线程,run方法相当于调用普通的对象方法,并不会开启抢占资源。只有通过start方法,才能开启线程,进而抢占CPU的资源。
2.实现Runnable接口
创建自定义类实现Runnable接口,实现run方法。与第一种方法基本相同。
public class MyRunnable implements Runnable {
@Override
public void run() {
// TODO Auto-generated method stub
for(int i=0;i<1000;i++) {
System.out.println("========MyRunnable=======");
}
}
}
MyRunnable runnable = new MyRunnable();
Thread thread = new Thread(runnable);
thread.start();
理解线程和任务:
线程可以理解为"抢占CPU资源的工具",任务是具体的业务逻辑。理解了这两个,接下来就能理解两者的区别。
区别
- 继承Thread的方式,直接在类中重写了run方法(业务逻辑),Thread中包含了Runnable。使用时,直接实例化MyThread,调用start抢占资源即可。
- 实现Runnable接口的方式,重写了run方法(业务逻辑),但是还缺少“抢占线程的工具”,因此需实例化线程对象Thread,再将业务逻辑注入到Thread中,再调用start即可。
- Runnable接口的方式代码解耦性高,实际开发推荐第二种。
线程的状态
线程共有 5 种状态,在特定的情况下,线程可以在不同的状态之间切换,5 种状态如下所示。
扫描二维码关注公众号,回复:
13210597 查看本文章
- 创建状态:实例化一个新的线程对象,还未启动。
- 就绪状态:创建好的线程对象调用 start 方法完成启动,进入线程池等待抢占 CPU 资源。
- 运行状态:线程对象获取了 CPU 资源,在一定的时间内执行任务。
- 阻塞状态:正在运行的线程暂停执行任务,释放所占用的 CPU 资源,并在解除阻塞状态之后也不能直接回到运行状态,而是重新回到就绪状态,等待获取 CPU 资源。
- 终止状态:线程运行完毕或因为异常导致该线程终止运行。