当前位置:编程学习 > 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.zzzyk.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(); 
            } 
        } 
    } 

运行的结果为

补充:软件开发 , Java ,
CopyRight © 2012 站长网 编程知识问答 www.zzzyk.com All Rights Reserved
部份技术文章来自网络,