产品
package thread.myPAC;public class Product { private int id; private String name; public Product(int id, String name) { this.id = id; this.name = name; } public int getId() { return id; } public void setId(int id) { this.id = id; } public String getName() { return name; } public void setName(String name) { this.name = name; } @Override public String toString() { return "Product{" + "id=" + id + ", name='" + name + ''' + '}'; }}
仓库
package thread.myPAC;public class Storage { Product[] products = new Product[10]; int top = 0; public synchronized void push(Product product) throws InterruptedException { while (top == products.length) { System.out.println("仓库已满"); wait(); } products[top++]=product; System.out.println(Thread.currentThread().getName() + " 生产产品" + product); notifyAll(); } public synchronized Product pop() throws InterruptedException { while (top == 0) { try { System.out.println("仓库已空"); wait(); } catch (InterruptedException e) { e.printStackTrace(); } } --top; Product p = new Product(products[top].getId(), products[top].getName()); products[top] = null; System.out.println(Thread.currentThread().getName() + " 取出产品" + p); notifyAll(); return p; }}
生产者
package thread.myPAC;public class Producer implements Runnable { private Storage storage; public Producer(Storage storage) { this.storage = storage; } @Override public void run() { for (int i = 0; i < 10; i++) { try { storage.push(new Product(i, "product" + i)); } catch (InterruptedException e) { e.printStackTrace(); } } }}
消费者
package thread.myPAC;public class Consumer implements Runnable { private Storage storage; public Consumer(Storage storage) { this.storage = storage; } @Override public void run() { for (int i = 0; i < 10; i++) { try { storage.pop(); Thread.sleep(100); } catch (InterruptedException e) { e.printStackTrace(); } } }}
主函数
package thread.myPAC;public class PACTest { public static void main(String[] args) throws InterruptedException { Storage storage = new Storage(); Thread consumer1 = new Thread(new Consumer(storage)); consumer1.setName("消费者1"); Thread consumer2 = new Thread(new Consumer(storage)); consumer2.setName("消费者2"); Thread producer1 = new Thread(new Producer(storage)); producer1.setName("生产者1"); Thread producer2 = new Thread(new Producer(storage)); producer2.setName("生产者2"); producer1.start(); producer2.start(); Thread.sleep(1000); consumer1.start(); consumer2.start(); }}
- 同类线程通信,如果继承Thread,要应用动态变量进行通信;如果实现runnable接口,成员变量就能够通信。
- 不同类线程通信,要在上一层进行配置。如mian中的Storage被生产者和消费者共用。