Java线程创建:继承Thread、实现Runnable、Callable与线程池解析
13 浏览量
更新于2024-08-31
收藏 175KB PDF 举报
本文主要介绍了线程创建的四种方式及其生命周期,包括继承Thread类、实现Runnable接口、实现Callable接口以及使用线程池,并探讨了线程的生命周期。
一、线程与进程
在计算机系统中,进程是正在执行的程序实例,而线程是进程内的执行单元。一个进程中可以有多个并发执行的线程,如浏览器同时打开多个网页就涉及到了多线程。
二、线程创建
1. 继承Thread类
要创建线程,可以通过创建一个新的类,该类继承自Thread类,并重写run()方法。在run()方法中编写线程执行的代码。然后在测试类中创建该自定义线程对象并调用start()方法启动线程。
```java
public class MyThread extends Thread {
@Override
public void run() {
for (int i = 0; i < 10; i++) {
System.out.println("mythread线程正在执行:" + new Date().getTime());
}
}
}
// 测试类
public class Test {
public static void main(String[] args) {
MyThread myThread = new MyThread();
myThread.start();
}
}
```
2. 实现Runnable接口
另一种方式是创建一个实现Runnable接口的类,同样在run()方法中编写线程执行的代码。然后在测试类中,将Runnable对象作为参数传递给Thread的构造函数创建线程对象并启动。
```java
public class MyRunnable implements Runnable {
@Override
public void run() {
// 线程执行的代码
}
}
// 测试类
public class Test {
public static void main(String[] args) {
Thread thread = new Thread(new MyRunnable());
thread.start();
}
}
```
3. 实现Callable接口
Callable接口类似于Runnable,但返回一个结果。创建Callable实现类后,需要使用FutureTask包装Callable对象,然后通过Thread的构造函数启动线程。
```java
public class MyCallable implements Callable<String> {
@Override
public String call() throws Exception {
// 线程执行的代码并返回结果
return "Callable线程执行完成";
}
}
// 测试类
public class Test {
public static void main(String[] args) throws ExecutionException, InterruptedException {
FutureTask<String> futureTask = new FutureTask<>(new MyCallable());
Thread thread = new Thread(futureTask);
thread.start();
System.out.println(futureTask.get()); // 获取结果
}
}
```
4. 使用线程池
线程池是一种更高效、灵活的管理线程的方式。它可以重复使用预创建的线程,避免频繁创建和销毁线程带来的开销。Java中通过ExecutorService和ThreadPoolExecutor来创建和管理线程池。
- why使用线程池:提高性能,避免大量创建销毁线程,更好地管理和控制并发任务。
- 关系图:ExecutorService是线程池的接口,ThreadPoolExecutor是具体实现。
- ThreadPoolExecutor全参构造函数:核心线程数、最大线程数、线程空闲时间、时间单位、工作队列等参数。
- 常用线程池:
- newCachedThreadPool:缓存线程池,会根据需要创建新线程,空闲线程超时后会被终止。
- newFixedThreadPool:固定大小的线程池,核心线程数和最大线程数相同,超出的请求会被放入队列等待。
- newSingleThreadExecutor:单线程池,只有一个线程处理任务,保证任务顺序执行。
- newScheduledThreadPool:调度线程池,可定时或延迟执行任务。
5. 自定义线程池接口
可以创建自定义线程类,实现Runnable或Callable接口,并结合线程池进行任务提交。
三、线程生命周期
线程的生命周期包括新建、就绪、运行、阻塞和死亡五个阶段:
1. 新建:线程被创建但尚未启动。
2. 就绪:线程已启动,等待操作系统分配CPU时间片。
3. 运行:线程获得CPU时间片并执行。
4. 阻塞:线程因I/O操作、同步阻塞等原因暂停执行。
5. 死亡:线程执行完毕或异常导致线程结束。
总结
- 继承Thread类和实现Runnable接口都是创建线程的方式,前者可以直接调用start()方法,后者需通过Thread对象启动。
- Runnable接口不支持返回值,Callable接口支持返回结果。
- 线程池能更有效地管理线程,提高系统性能。不同类型的线程池适用于不同的场景。
2023-08-24 上传
2013-09-10 上传
2021-10-24 上传
点击了解资源详情
点击了解资源详情
点击了解资源详情
点击了解资源详情
点击了解资源详情
点击了解资源详情
weixin_38623272
- 粉丝: 5
- 资源: 853
最新资源
- torch_sparse-0.6.12-cp37-cp37m-linux_x86_64whl.zip
- React-Native-Navigation-V5
- 33code-data.zip_matlab例程_MathCAD_
- Yod Framework开发框架最新官方版
- 0911Homework-1:毫无意义的文件处理
- frontend-nanodegree-mock-portfolio:Udacity前端纳米P1
- 亚马逊客户零售分析解决方案:深入研究亚马逊的前100名排名方法,研究700多种产品,再加上广泛的电子商务分析解决方案,以增强客户定位和促销范围
- Todo_Hooks_MaterialUI:TODO basico hecho con React +挂钩+ MaterialUI + SASS
- GoldenEgg:“学习虚幻引擎4的C ++编程”资源库
- 毕业设计&课设-基于MATLAB的车辆漂移动力学仿真.zip
- mybatis-pages:MyBatis 插件Interceptor实现分页 数据库表查询的分页
- go-filewatcher:轻量级FileWatcher
- 灿烂之春flash季节贺卡
- 使用C#打印商品出库单据
- CDC DTK Extension-crx插件
- 毕业设计&课设-机载电子战系统中的测向.zip