Thread与Runnable的基本区别
Thread是Java中表示线程的类,直接继承Thread并重写run方法可以创建线程。Runnable是一个函数式接口,通过实现Runnable的run方法并将实例传递给Thread构造函数来创建线程。Runnable更灵活,适合资源共享场景。
创建线程的两种方式
继承Thread类:
java
class MyThread extends Thread {
@Override
public void run() {
System.out.println("Thread running");
}
}
// 启动线程
new MyThread().start();
实现Runnable接口:
java
class MyRunnable implements Runnable {
@Override
public void run() {
System.out.println("Runnable running");
}
}
// 启动线程
new Thread(new MyRunnable()).start();
共享资源与线程安全
Runnable更适合多线程共享资源场景,因为多个线程可以共享同一个Runnable实例。需要同步控制时,可使用synchronized关键字或Lock接口。
使用synchronized方法:
java
class SharedResource implements Runnable {
private int count = 0;
public synchronized void increment() {
count++;
}
@Override
public void run() {
for (int i = 0; i < 1000; i++) {
increment();
}
}
}
线程状态与管理
线程生命周期包含NEW、RUNNABLE、BLOCKED、WAITING、TIMED_WAITING和TERMINATED状态。通过Thread类的方法可以管理线程:
- start(): 启动线程
- join(): 等待线程结束
- interrupt(): 中断线程
- isAlive(): 检查线程是否存活
线程池优化
推荐使用ExecutorService管理线程,避免频繁创建销毁线程的开销:
java
ExecutorService executor = Executors.newFixedThreadPool(5);
executor.submit(new MyRunnable());
executor.shutdown();
常见并发问题解决方案
竞态条件:使用同步代码块或原子类(如AtomicInteger) 死锁:避免嵌套锁,按固定顺序获取锁 内存可见性:使用volatile关键字或同步机制
最佳实践
优先选择实现Runnable接口 避免直接使用Thread类的stop()和suspend()等已废弃方法 使用线程池而非直接创建线程 同步范围尽量缩小,减少性能影响 考虑使用java.util.concurrent包中的高级并发工具