Java线程创建:继承Thread、实现Runnable、Callable与线程池解析

0 下载量 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接口支持返回结果。 - 线程池能更有效地管理线程,提高系统性能。不同类型的线程池适用于不同的场景。