1. 继承Thread类
- 基本步骤:
- 定义一个类继承自
Thread
类。 - 重写
Thread
类的run()
方法,将线程的任务代码放在run()
方法中。 - 创建
Thread
子类的实例,即创建了线程对象。 - 调用线程对象的
start()
方法来启动该线程。
- 定义一个类继承自
- 示例:
public class MyThread extends Thread { @Override public void run() { System.out.println("线程运行中..."); } public static void main(String[] args) { MyThread t = new MyThread(); t.start(); } }
2. 实现Runnable接口
- 基本步骤:
- 定义一个类实现
Runnable
接口。 - 实现
Runnable
接口的run()
方法,将线程的任务代码放在run()
方法中。 - 创建
Runnable
实现类的实例,并以此实例作为Thread
的构造器参数创建Thread
对象,该Thread
对象才是真正的线程对象。 - 调用线程对象的
start()
方法来启动该线程。
- 定义一个类实现
- 示例:
public class MyRunnable implements Runnable { @Override public void run() { System.out.println("线程运行中..."); } public static void main(String[] args) { Thread t = new Thread(new MyRunnable()); t.start(); } }
3. 实现Callable接口与FutureTask
- 基本步骤:
- 定义一个类实现
Callable
接口,并实现call()
方法,该call()
方法将作为线程执行体,并且有返回值。 - 创建
Callable
实现类的实例。 - 使用
FutureTask
类来包装Callable
对象,FutureTask
对象封装了Callable
对象的call()
方法的返回值。 - 使用
FutureTask
对象作为Thread
对象的构造器参数创建并启动新线程。 - 调用
FutureTask
对象的get()
方法来获得子线程执行结束后的返回值。
- 定义一个类实现
4. 使用线程池
Java并发API提供了多种线程池实现,如ExecutorService
接口的实现类(如ThreadPoolExecutor
、ScheduledThreadPoolExecutor
等)。使用线程池可以更加灵活和高效地管理线程资源。
- 常见的线程池类型:
newSingleThreadExecutor
:单线程的线程池,所有任务顺序执行。newFixedThreadPool
:固定大小的线程池,每次提交一个任务就创建一个线程,直到达到线程池的最大大小。newCachedThreadPool
:可缓存的线程池,线程池的大小依赖于JVM能够创建的最大线程数,当线程空闲超过一定时间后会被回收。newScheduledThreadPool
:大小无限的线程池,支持定时及周期性执行任务。
- 示例(以
newFixedThreadPool
为例):ExecutorService executor = Executors.newFixedThreadPool(5); // 创建一个固定大小为5的线程池 for (int i = 0; i < 10; i++) { Runnable worker = new WorkerThread("" + i); executor.execute(worker); } executor.shutdown(); // 停止接受新任务,但已提交的任务会继续执行