一、 线程和进程
https://blog.csdn.net/mu_wind/article/details/124616643
一个进程可以包含多个线程
进程
进程是程序执行时的一个实例,即它是程序已经执行到课中程度的数据结构的汇集。
进程是程序执行相关资源(CPU、内存、磁盘等)分配的最小单元
进程是一系列线程的集合
进程之间是相互独立的,有自己的内存空间
线程
线程是CPU资源分配的最小单元
线程需要的资源更少,可以看做是一种轻量级的进程
线程会共享进程中的内存,线程也有独立的空间(栈、程序计数器)
线程相互通信更加方便
二、线程实现方式
1.继承Thread类
- 继承Thread类
- 重写run方法
- 调用start启动线程 ⚠️线程的run和start的区别,run没有启动新线程,在主线程中执行start才能启动新线程
class ExtendsThread extends Thread {
// 重写run方法, 条件自己的任务
@Override
public void run() {
// 添加一个任务打印一百次:MyThread线程任务 ----
for (int i = 1; i < 10; i ) {
System.out.println("ExtendsThread线程任务 ---- " i);
}
}
}
public class ThreadDemo {
public static void main(String[] args) {
//继承Thread
ExtendsThread extendsThread = new ExtendsThread();
// extendsThread.getName();
extendsThread.start();
}
}
2.实现 Runnable 接口
- 实现Runnable接口
- 实现run方法
- 创建实现Runnable接口的对象,传入Thread对象中
public class ThreadDemo {
class RunnableThread implements Runnable {
@Override
public void run() {
System.out.println("RunnableThread 用实现Runnable接口实现线程");
}
}
public class ThreadDemo {
public static void main(String[] args) {
//实现runnable
RunnableThread runnableThread = new RunnableThread();
runnableThread.run();
}
}
3.实现 Callable 接口
代码语言:java复制class CallableTask implements Callable<Integer> {
@Override
public Integer call() throws Exception {
return new Random().nextInt();
}
}
public class ThreadDemo {
public static void main(String[] args) {
//创建Callable对象,传入FutureTask对象
FutureTask<Integer> task = new FutureTask<>(new CallableTask());
//创建FutureTask对象到Thread对象中
Thread thread = new Thread(task);
//启动线程
thread.start();
System.out.println("-----等待结果-----");
//获得返回值
try {
System.out.println(task.get());
} catch (InterruptedException e) {
e.printStackTrace();
} catch (ExecutionException e) {
e.printStackTrace();
}
}
}
三、 继承Thread和实现Runnable的区别
继承Thread类,每次都需要新建一个Thread,开销大
Java不支持双继承,继承Thread不能继承其它的类,语法有限制
实现Runnable接口,可以继承其它类,语法没有限制
Runnalbe接口强制要求实现run方法,不容易出现错误