Java 多线程
Java 线程问题总结
1. 线程的基本概念
- 线程:线程是操作系统能够进行运算调度的最小单位。它被包含在进程之中,是进程中的实际运作单位。
- 进程:进程是程序的一次执行过程,是系统进行资源分配和调度的独立单位。
2. 创建线程的方式
- 继承Thread类:直接继承Thread类,并重写
run()
方法。1
2
3
4
5
6public class MyThread extends Thread {
@Override
public void run() {
// 线程执行的代码
}
} - 实现Runnable接口:实现Runnable接口,并实现
run()
方法,然后将该实例传递给Thread构造函数。1
2
3
4
5
6
7
8
9public class MyRunnable implements Runnable {
@Override
public void run() {
// 线程执行的代码
}
}
Thread thread = new Thread(new MyRunnable());
thread.start(); - 使用Callable和Future:实现Callable接口,可以返回一个值,并且可以抛出异常。
1
2
3
4
5
6
7
8
9
10public class MyCallable implements Callable<String> {
@Override
public String call() throws Exception {
return "Result";
}
}
ExecutorService executor = Executors.newSingleThreadExecutor();
Future<String> future = executor.submit(new MyCallable());
String result = future.get(); // 阻塞等待结果
3. 线程的状态
- 新建(New):线程对象被创建,但尚未调用
start()
方法。 - 就绪(Runnable):线程调用了
start()
方法,等待CPU调度。 - 运行(Running):线程获得CPU时间片,正在执行。
- 阻塞(Blocked):线程因为某些原因(如等待I/O操作、调用
wait()
方法)暂时停止运行。 - 等待(Waiting):线程调用
wait()
方法或join()
方法,等待其他线程的通知。 - 超时等待(Timed Waiting):线程调用
sleep()
方法或带有超时的wait()
方法,等待指定的时间。 - 终止(Terminated):线程执行完毕或被中断。
4. 线程的常用方法
start()
:启动线程,使其进入就绪状态。run()
:线程的执行体。sleep(long millis)
:使当前线程暂停执行指定的时间。join()
:等待该线程终止。yield()
:暂停当前线程,让其他线程有机会执行。interrupt()
:中断线程。isInterrupted()
:测试线程是否被中断。interrupted()
:测试当前线程是否被中断,并清除中断状态。
5. 线程同步
- synchronized关键字:用于同步方法或代码块,确保同一时间只有一个线程可以执行该代码。
1
2
3
4
5
6
7
8
9public synchronized void method() {
// 同步方法
}
public void method() {
synchronized (this) {
// 同步代码块
}
} - Lock接口:提供比
synchronized
更灵活的锁操作。1
2
3
4
5
6
7Lock lock = new ReentrantLock();
lock.lock();
try {
// 需要同步的代码
} finally {
lock.unlock();
}
6. 线程通信
- wait()和notify()方法:用于线程间的通信,必须在
synchronized
块中使用。1
2
3
4
5synchronized (lock) {
lock.wait(); // 使当前线程等待
lock.notify(); // 唤醒一个等待的线程
lock.notifyAll(); // 唤醒所有等待的线程
}
7. 线程池
- Executor框架:用于管理线程的创建、调度和销毁。
1
2
3
4
5ExecutorService executor = Executors.newFixedThreadPool(10);
executor.submit(() -> {
// 线程执行的代码
});
executor.shutdown();
Java 多线程
http://example.com/2025/02/28/Java/JavaSummary02/