【复习】进程和线程

179 阅读2分钟

「这是我参与2022首次更文挑战的第24天,活动详情查看:2022首次更文挑战

【复习】进程和线程

最近看了一些面试题,其中就包含这个命题,所以再来复习一下这个进程和线程的相关知识,这篇文章主要复习线程的知识。

进程和线程的区别

理论知识不再阐述,而引用大家都比较认同的答案。

抽象一点: 进程是资源分配的最小单位,线程是CPU调度的最小单位

具体一点:进程像火车,而线程是车厢

比如线程在进程下行进(单纯的车厢无法运行)

比如一个进程可以包含多个线程(一辆火车可以有多个车厢)

比如不同进程间数据很难共享(一辆火车上的乘客很难换到另外一辆火车,比如站点换乘

比如同一进程下不同线程间数据很易共享(A车厢换到B车厢很容易)

比如进程要比线程消耗更多的计算机资源(采用多列火车相比多个车厢更耗资源)

引用来自 传送门

创建线程的方式

创建线程最常用的两种方式。

  • 继承Thread类创建线程

1)集成Thread类并实现run方法

2)通过new Thread,执行start方法


class TestThread extends Thread{

@Override

public void run() {

super.run();

System.out.println("线程中执行");

}

}


class Test {

public static void main(String[] args) {

new TestThread().start();

}

}

  • 实现Runnable接口

1)实现Runnable接口,并重写run方法

2)将Runnable的实例传入Thread类的构造函数中


class TestRunnable implements Runnable{

@Override

public void run() {

System.out.println("线程中执行");

}

}


class Test {

public static void main(String[] args) {

new Thread(new TestRunnable()).start();

}

}

run和start的区别

这是一道高频的面试题,看一遍就能完全理解了。

start是启动线程的方法,而run是线程类的中回调方法。

如果手动执行new TestThread().run方法,实际上还是在主线程。

在线程中打印线程的名字


class TestRunnable implements Runnable {

@Override

public void run() {

System.out.println("线程名:" + Thread.currentThread().getName());

}

}

执行run方法,得到以下输出


public static void main(String[] args) {

new Thread(new TestRunnable()).run();

}

// 线程名:main

执行start方法,得到以下输出


public static void main(String[] args) {

new Thread(new TestRunnable()).start();

}

// 线程名:Thread-2

可以看到直接调用run是运行在普通方法中,而调用start才是开辟的子线程。