Java线程内部通信应用场景

程序你得看得懂 2024-02-25 01:58:45

Java线程内部通信主要用于协调多个线程之间的操作,确保它们能够按照预期的方式协同工作。常见的应用场景包括生产者-消费者问题、线程池中的任务调度、并发数据结构的实现等。

下面是一个生产者-消费者问题的示例,使用Java的内置同步机制(synchronized关键字和wait/notify方法)来实现线程间的通信:

import java.util.LinkedList; import java.util.Queue; public ProducerConsumerExample { public static void main(String[] args) { SharedBuffer sharedBuffer = new SharedBuffer(); Thread producerThread = new Thread(new Producer(sharedBuffer)); Thread consumerThread = new Thread(new Consumer(sharedBuffer)); producerThread.start(); consumerThread.start(); } static SharedBuffer { private static final int MAX_SIZE = 5; private Queue<Integer> buffer = new LinkedList<>(); public synchronized void produce() { while (buffer.size() == MAX_SIZE) { try { wait(); } catch (InterruptedException e) { e.printStackTrace(); } } buffer.offer(1); // 假设每次生产一个整数1 notifyAll(); } public synchronized void consume() { while (buffer.isEmpty()) { try { wait(); } catch (InterruptedException e) { e.printStackTrace(); } } buffer.poll(); // 消费一个元素 notifyAll(); } } static Producer implements Runnable { private SharedBuffer sharedBuffer; public Producer(SharedBuffer sharedBuffer) { this.sharedBuffer = sharedBuffer; } @Override public void run() { for (int i = 0; i < 10; i++) { sharedBuffer.produce(); System.out.println("Produced 1, buffer size: " + sharedBuffer.buffer.size()); try { Thread.sleep(100); // 模拟生产耗时 } catch (InterruptedException e) { e.printStackTrace(); } } } } static Consumer implements Runnable { private SharedBuffer sharedBuffer; public Consumer(SharedBuffer sharedBuffer) { this.sharedBuffer = sharedBuffer; } @Override public void run() { for (int i = 0; i < 10; i++) { sharedBuffer.consume(); System.out.println("Consumed 1, buffer size: " + sharedBuffer.buffer.size()); try { Thread.sleep(200); // 模拟消费耗时 } catch (InterruptedException e) { e.printStackTrace(); } } } } }

在这个示例中,SharedBuffer类用于在生产者和消费者之间共享数据。生产者线程通过调用produce方法向缓冲区中添加数据,而消费者线程通过调用consume方法从缓冲区中消费数据。当缓冲区满时,生产者线程会等待,直到消费者线程消费了一些数据并释放了缓冲区空间。同样,当缓冲区为空时,消费者线程会等待,直到生产者线程生产了一些数据。

注意,这个示例使用了synchronized关键字来确保同一时间只有一个线程可以访问produce或consume方法。wait和notifyAll方法用于在条件不满足时挂起线程,并在条件满足时唤醒等待的线程。

0 阅读:2

程序你得看得懂

简介:感谢大家的关注