復(fù)習(xí)多線程,一個(gè)經(jīng)典的實(shí)例:生產(chǎn)者消費(fèi)者問題:
1.number表示產(chǎn)品編號(hào),flag表示現(xiàn)在應(yīng)該由誰(shuí)來操作.
2.ProcuctData類中有兩個(gè)同步方法setNumber()和getNumber(),分別代表生產(chǎn)者生產(chǎn)產(chǎn)品和消費(fèi)者消費(fèi) 產(chǎn)品。
3.兩個(gè)線程類Producer和Consumer分別代表生產(chǎn)者與消費(fèi)者
Java代碼
- package cn.luxsoft.javafirststep.Thread;
- class ProductData {
- // 產(chǎn)品編號(hào)
- private int number;
- // 標(biāo)記位
- private boolean flag = true;
- public synchronized void setNumber(int number) {
- if (!flag) {
- try {
- // 末消費(fèi)等待
- wait();
- } catch (InterruptedException e) {
- e.printStackTrace();
- }
- }
- this.number = number;
- // 標(biāo)記已經(jīng)產(chǎn)生
- flag = false;
- // 通知消費(fèi)者已經(jīng)生產(chǎn),可以消費(fèi)
- notify();
- }
- public synchronized int getNumber() {
- if (flag) {
- try {
- // 未生產(chǎn)等待
- wait();
- } catch (InterruptedException e) {
- e.printStackTrace();
- }
- }
- // 標(biāo)記已消費(fèi)
- flag = true;
- // 通知需要生產(chǎn)
- 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 + "]生產(chǎn).");
- }
- }
- }
- 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 + "]消費(fè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:
