Java多线程
创建线程的三种方式
Java中创建线程有三种常见的方式:继承Thread类、实现Runnable接口和使用Callable和Future。
1. 继承Thread类
java复制代码public class MyThread extends Thread {
public void run() {
// 线程执行的代码
}
}
// 在主线程中创建并启动新线程
public static void main(String[] args) {
MyThread thread = new MyThread();
thread.start();
}
2. 实现Runnable接口
java复制代码public class MyRunnable implements Runnable {
public void run() {
// 线程执行的代码
}
}
// 在主线程中创建并启动新线程
public static void main(String[] args) {
MyRunnable runnable = new MyRunnable();
Thread thread = new Thread(runnable);
thread.start();
}
3. 使用Callable和Future
java复制代码import java.util.concurrent.Callable;
import java.util.concurrent.FutureTask;
public class MyCallable implements Callable<Integer> {
public Integer call() {
// 线程执行的代码
return result;
}
}
// 在主线程中创建并启动新线程
public static void main(String[] args) {
MyCallable callable = new MyCallable();
FutureTask<Integer> futureTask = new FutureTask<>(callable);
Thread thread = new Thread(futureTask);
thread.start();
}
多线程中的常用成员方法
线程的生命周期
一个线程的生命周期包括五个阶段:新建(New)、就绪(Runnable)、运行(Running)、阻塞(Blocked)和终止(Terminated)。
- 新建(New):当线程对象被创建后,就处于新建状态。此时线程尚未启动。
- 就绪(Runnable):当调用线程的
start()
方法后,线程进入就绪状态,等待系统分配执行时间片。 - 运行(Running):当就绪的线程获得了CPU时间片后,开始执行线程的
run()
方法,进入运行状态。 - 阻塞(Blocked):在某些情况下,线程可能会被暂时挂起,如等待I/O操作完成或获取锁资源。此时线程进入阻塞状态。
- 终止(Terminated):线程的
run()
方法执行完毕或者出现异常时,线程终止,进入终止状态。
线程池
线程池是一种管理和复用线程的机制,可以减少线程创建和销毁的开销,并提高对并发任务的处理效率。Java提供了Executor框架来实现线程池。
java复制代码import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
public class ThreadPoolExample {
public static void main(String[] args) {
ExecutorService executor = Executors.newFixedThreadPool(5);
for (int i = 0; i < 10; i++) {
Runnable worker = new MyRunnable();
executor.execute(worker);
}
executor.shutdown();
while (!executor.isTerminated()) {
// 等待所有任务完成
}
System.out.println("所有任务已完成");
}
}
or.isTerminated()) {
// 等待所有任务完成
}
System.out.println("所有任务已完成");
}
}