解析该代码: SharedData.java ``` public class SharedData { private int data; private boolean available = false; public synchronized void setData(int data) { while (available) { try { wait(); } catch (InterruptedException e) { e.printStackTrace(); } } this.data = data; available = true; notifyAll(); } public synchronized int getData() { while (!available) { try { wait(); } catch (InterruptedException e) { e.printStackTrace(); } } available = false; notifyAll(); return data; } } ``` Producer.java ``` public class Producer implements Runnable { private SharedData sharedData; private int producerId; public Producer(SharedData sharedData, int producerId) { this.sharedData = sharedData; this.producerId = producerId; } @Override public void run() { for (int i = 0; i < 10; i++) { sharedData.setData(i); System.out.println("Producer " + producerId + " produced: " + i); try { Thread.sleep((int) (Math.random() * 100)); } catch (InterruptedException e) { e.printStackTrace(); } } } } ``` Consumer.java ``` public class Consumer implements Runnable { private SharedData sharedData; private int consumerId; public Consumer(SharedData sharedData, int consumerId) { this.sharedData = sharedData; this.consumerId = consumerId; } @Override public void run() { for (int i = 0; i < 10; i++) { int data = sharedData.getData(); System.out.println("Consumer " + consumerId + " consumed: " + data); try { Thread.sleep((int) (Math.random() * 100)); } catch (InterruptedException e) { e.printStackTrace(); } } } } ``` Main.java ``` public class Main { public static void main(String[] args) { SharedData sharedData = new SharedData(); Producer producer1 = new Producer(sharedData, 1); Producer producer2 = new Producer(sharedData, 2); Consumer consumer1 = new Consumer(sharedData, 1); Consumer consumer2 = new Consumer(sharedData, 2); Thread t1 = new Thread(producer1); Thread t2 = new Thread(producer2); Thread t3 = new Thread(consumer1); Thread t4 = new Thread(consumer2); t1.start(); t2.start(); t3.start(); t4.start(); } }
时间: 2024-02-15 19:26:51 浏览: 117
BST_javaBST_https://bst.91_bstcom_
这段代码展示了一个生产者-消费者模型的实现,其中SharedData类是共享数据类,Producer类是生产者类,Consumer类是消费者类,Main类是程序入口。
在SharedData类中,有一个int类型的数据data和一个boolean类型的available变量,available表示数据是否可用。setData()方法用于设置数据,使用synchronized关键字保证了线程安全。在setData()方法中,如果数据不可用则等待,直到数据可用,然后设置数据,将available设置为true,最后唤醒所有等待线程,表示数据可用。getData()方法用于获取数据,也使用synchronized关键字保证了线程安全。在getData()方法中,如果数据不可用则等待,直到数据可用,然后获取数据,将available设置为false,最后唤醒所有等待线程,表示数据不可用。
在Producer类中,有一个SharedData类型的共享数据对象sharedData和一个producerId表示生产者的ID。在run()方法中,循环生产10个数据,每次设置数据后输出生产者的ID和生产的数据,随机休眠一段时间。
在Consumer类中,有一个SharedData类型的共享数据对象sharedData和一个consumerId表示消费者的ID。在run()方法中,循环消费10个数据,每次获取数据后输出消费者的ID和消费的数据,随机休眠一段时间。
在Main类中,创建了一个SharedData对象和两个Producer对象、两个Consumer对象。然后创建4个线程分别运行4个对象的run()方法。这样就构成了一个生产者-消费者模型,多个生产者可以同时生产数据,多个消费者可以同时消费数据,共享数据被保护在SharedData类中,保证了线程安全。
阅读全文