Java多线程通信问题详解
在Java编程中,多线程通信是一个关键主题。它涉及到不同线程之间的信息交换。下面详细讲解几个主要的通信方式:
共享变量:
- 通过
synchronized
关键字保护的变量可以被多个线程共享。 示例代码:
// 同步锁
private Object lock = new Object();
public void thread1() {
synchronized (lock) { // 确保互斥访问
System.out.println("Thread 1: Before acquire");
lock.notifyAll(); // 唤醒所有等待的线程
System.out.println("Thread 1: After release");
}
// 其他操作...
}
public void thread2() {
synchronized (lock) { // 同理,互斥访问
System.out.println("Thread 2: Before acquire");
lock.wait(); // 等待锁释放
System.out.println("Thread 2: After release");
}
// 其他操作...
}
- 通过
信号量机制:
- Java内置的
Semaphore
类提供了信号量机制。 示例代码:
// 创建一个信号量,初始值为1(表示只有一个许可证)
Semaphore semaphore = new Semaphore(1);
public void thread1() {
try {
// 请求一个许可证
semaphore.acquire();
System.out.println("Thread 1: Acquired license");
// 执行其他任务...
// 释放许可证
semaphore.release();
System.out.println("Thread 1: Released license");
} catch (InterruptedException e) {
e.printStackTrace();
}
// 其他操作...
}
public void thread2() {
try {
// 请求一个许可证,如果已满则等待
semaphore.acquire();
System.out.println("Thread 2: Acquired license");
// 执行其他任务...
// 释放许可证,不需要特别调用方法,因为已经持有许可证
semaphore.release();
System.out.println("Thread 2: Released license");
} catch (InterruptedException e) {
e.printStackTrace();
}
// 其他操作...
}
- Java内置的
wait/notify:
- 这是线程通信中最基础的方式。
- 示例代码同上,但不使用信号量。
掌握以上几种多线程通信方式后,可以根据具体需求和场景选择合适的方法。
还没有评论,来说两句吧...