「这是我参与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才是开辟的子线程。