Java线程创建:继承Thread、实现Runnable、Callable与线程池解析
153 浏览量
更新于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 上传
2014-03-04 上传
2023-05-26 上传
2023-06-05 上传
2023-05-31 上传
2023-05-25 上传
2024-06-13 上传
2023-05-16 上传
2023-06-09 上传
weixin_38623272
- 粉丝: 5
- 资源: 853
最新资源
- C++标准程序库:权威指南
- Java解惑:奇数判断误区与改进方法
- C++编程必读:20种设计模式详解与实战
- LM3S8962微控制器数据手册
- 51单片机C语言实战教程:从入门到精通
- Spring3.0权威指南:JavaEE6实战
- Win32多线程程序设计详解
- Lucene2.9.1开发全攻略:从环境配置到索引创建
- 内存虚拟硬盘技术:提升电脑速度的秘密武器
- Java操作数据库:保存与显示图片到数据库及页面
- ISO14001:2004环境管理体系要求详解
- ShopExV4.8二次开发详解
- 企业形象与产品推广一站式网站建设技术方案揭秘
- Shopex二次开发:触发器与控制器重定向技术详解
- FPGA开发实战指南:创新设计与进阶技巧
- ShopExV4.8二次开发入门:解决升级问题与功能扩展