进程、线程、多线程概念

目录

进程

进程是一个动态概念,当我们启动一个应用的时候,就启动了一个进程。关闭一个应用时,进程即结束。

线程

线程是组成进程的基本单位,一个进程由一个或多个线程组成。线程与进程都是动态的。

区别

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资源的工具",任务是具体的业务逻辑。理解了这两个,接下来就能理解两者的区别。

区别

  1. 继承Thread的方式,直接在类中重写了run方法(业务逻辑),Thread中包含了Runnable。使用时,直接实例化MyThread,调用start抢占资源即可。
  2. 实现Runnable接口的方式,重写了run方法(业务逻辑),但是还缺少“抢占线程的工具”,因此需实例化线程对象Thread,再将业务逻辑注入到Thread中,再调用start即可。
  3. Runnable接口的方式代码解耦性高,实际开发推荐第二种。

线程的状态

线程共有 5 种状态,在特定的情况下,线程可以在不同的状态之间切换,5 种状态如下所示。

  • 创建状态:实例化一个新的线程对象,还未启动。
  • 就绪状态:创建好的线程对象调用 start 方法完成启动,进入线程池等待抢占 CPU 资源。
  • 运行状态:线程对象获取了 CPU 资源,在一定的时间内执行任务。
  • 阻塞状态:正在运行的线程暂停执行任务,释放所占用的 CPU 资源,并在解除阻塞状态之后也不能直接回到运行状态,而是重新回到就绪状态,等待获取 CPU 资源。
  • 终止状态:线程运行完毕或因为异常导致该线程终止运行。

在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/after_17/article/details/114296518