java中多線程 盒子中取值問題 – JAVA編程語言程序開發技術文章

package com.zhu.thread; 
 
public class ThreadBox { 
    public static void main(String[] args) { 
        Box box = new Box(); 
        Producer pro = new Producer(box); 
        Customer cus = new Customer(box); 
        Thread tpro = new Thread(pro); 
        Thread tcus = new Thread(cus); 
        tpro.start(); 
        tcus.start();//這裡假如線程Customer先得到cup的運行(cup運行是隨機的) 
    } 

 
class Box { 
    private int number; 
    private boolean have = false; 
 
    public synchronized int getNumber() { 
        if (!have) { 
            try { 
                /**1,當Customer線程第一次調用getNumber方法時候如果number中沒有值則hava為false
                 * 則會進入wait等待…
                 * 2,當Producer線程調用setNubmer方法時候會調用notify()方法此時隻有一個線程處於wait中則會繼續運行Customer線程
                 * 
                 */ 
                wait(); 
            } catch (InterruptedException e) { 
                // TODO Auto-generated catch block 
                e.printStackTrace(); 
            } 
        } 
        have = false; 
        notify();//得到值之後喚醒處於等待中的producer線程 
        return number; 
    } 
 
    public synchronized void setNumber(int number) { 
        if (have) { 
            try { 
                /**
                 * 1,當Producer線程第一次調用setNumber時候此時hava默認值為false線程不會進入
                 * wait等待狀態…
                 * 2,當producer線程不等customer線程調用getNumber,第二次調用setNumber的時候此時have的值為true
                 * producer線程進入進入等待狀態直到getNumber中調用notify()方法此時隻有一個線程處於wait中則會繼續運行producer
                 * */ 
                wait(); 
            } catch (InterruptedException e) { 
                // TODO Auto-generated catch block 
                e.printStackTrace(); 
            } 
        } 
        have = true; 
        this.number = number; 
        // 註意在設置值之後在喚醒線程Customer 
        notify();//設置值之後喚醒等待中的線程Customer 
    } 
 

 
class Customer implements Runnable { 
    private Box box; 
 
    public Customer(Box box) { 
        this.box = box; 
    } 
 
    @Override 
    public void run() { 
        while (true) { 
            try { 
                Thread.sleep(100); 
            } catch (InterruptedException e) { 
                e.printStackTrace();  www.aiwalls.com
            } 
            System.out.println("c 取" + box.getNumber()); 
        } 
    } 
 

 
class Producer implements Runnable { 
    private Box box; 
    private int i = 1; 
 
    public Producer(Box box) { 
        this.box = box; 
    } 
 
    @Override 
    public void run() { 
        while (true) { 
            System.out.println("b 放" + i); 
            box.setNumber(i); 
            i++; 
            try { 
                Thread.sleep(1000); 
            } catch (InterruptedException e) { 
                // TODO Auto-generated catch block 
                e.printStackTrace(); 
            } 
        } 
    } 

運行的結果為
b 放1
c 取1
b 放2
c 取2
b 放3
c 取3
b 放4
c 取4
b 放5
c 取5
b 放6
c 取6
b 放7
c 取7
b 放8
c 取8
b 放9
c 取9
b 放10
c 取10
b 放11
c 取11
b 放12
c 取12
b 放13
c 取13
b 放14
c 取14
b 放15
c 取15
b 放16
c 取16
b 放17
c 取17
b 放18
c 取18
b 放19
c 取19
b 放20
c 取20
b 放21
c 取21
b 放22
c 取22
b 放23
c 取23
b 放24
c 取24
b 放25
c 取25
b 放26
c 取26
b 放27
c 取27
b 放28
c 取28
b 放29
c 取29

摘自 從點滴開始!!

發佈留言

發佈留言必須填寫的電子郵件地址不會公開。