復習多線程,一個經典的實例:生產者消費者問題:
1.number表示產品編號,flag表示現在應該由誰來操作.
2.ProcuctData類中有兩個同步方法setNumber()和getNumber(),分別代表生產者生產產品和消費者消費 產品。
3.兩個線程類Producer和Consumer分別代表生產者與消費者
Java代碼
- package cn.luxsoft.javafirststep.Thread;
- class ProductData {
- // 產品編號
- private int number;
- // 標記位
- private boolean flag = true;
- public synchronized void setNumber(int number) {
- if (!flag) {
- try {
- // 末消費等待
- wait();
- } catch (InterruptedException e) {
- e.printStackTrace();
- }
- }
- this.number = number;
- // 標記已經產生
- flag = false;
- // 通知消費者已經生產,可以消費
- notify();
- }
- public synchronized int getNumber() {
- if (flag) {
- try {
- // 未生產等待
- wait();
- } catch (InterruptedException e) {
- e.printStackTrace();
- }
- }
- // 標記已消費
- flag = true;
- // 通知需要生產
- notify();
- return this.number;
- }
- }
- class Procucer extends Thread {
- private ProductData s;
- Procucer(ProductData s) {
- this.s = s;
- }
- @Override
- public void run() {
- for (int i = 0; i < 10; i++) {
- s.setNumber(i);
- System.out.println("P[" + i + "]生產.");
- }
- }
- }
- class Consumer extends Thread {
- private ProductData s;
- Consumer(ProductData s) {
- this.s = s;
- }
- public void run() {
- int i;
- do {
- i = s.getNumber();
- System.out.println("P[" + i + "]消費.**");
- } while (i != 9);
- }
- }
- public class ProducerConsumer {
- /**
- * @param args
- */
- public static void main(String[] args) {
- ProductData s = new ProductData();
- Thread producer = new Procucer(s);
- Thread consumer = new Consumer(s);
- producer.start();
- consumer.start();
- }
- }
文章來源:http://www.my1984.net/?action=show&id=177
MSN:
