熱點推薦:
您现在的位置: 電腦知識網 >> 編程 >> Java編程 >> Java高級技術 >> 正文

Java線程通信的機制

2013-11-23 19:49:58  來源: Java高級技術 
    package rejavareview;
   
    import javautilLinkedList;
   
    import javautilList;
   
    /**
   
    *
   
    * @author Jay Chang
   
    *
   
    */
   
    class Stack {
   
    private List<Object> list = new LinkedList<Object>()
   
    /**
   
    * 出棧
   
    *
   
    * @return
   
    */
   
    public Object pop() {
   
    return listremove(listsize()
   
    }
   
    /**
   
    * 將元素壓入棧
   
    *
   
    * @param obj
   
    */
   
    public void push(Object obj) {
   
    listadd(listsize() obj)
   
    }
   
    public int size() {
   
    return listsize()
   
    }
   
    }
   
    /**
   
    *
   
    * @author Jay Chang
   
    *
   
    */
   
    class Producer extends Thread {
   
    private Stack stack;
   
    public Stack getStack() {
   
    return stack;
   
    }
   
    /**
   
    *
   
    * @param stack
   
    */
   
    public void setStack(Stack stack) {
   
    thisstack = stack;
   
    }
   
    /**
   
    * 生產者生產商品當商品棧滿時通知消費者消費商品
   
    */
   
    public void produce() {
   
    for (int i = ; i < ; i++) {
   
    // 同步stack
   
    synchronized (stack) {
   
    Systemoutprintln(producer get the lock
   
    //這裡指定存放商品的商品棧的最大容量為
   
    while (stacksize() == ) {
   
    try {
   
    //將生產者線程持有stack對象的鎖釋放並將生產者線程放到stack對象的等待池中
   
    stackwait()
   
    } catch (InterruptedException e) {
   
    eprintStackTrace()
   
    }
   
    }
   
    // 模擬生產者生產商品過程所需的時間
   
    try {
   
    Threadsleep(
   
    } catch (InterruptedException e) {
   
    eprintStackTrace()
   
    }
   
    String goods = goods + stacksize()
   
    //將生產的商品放到存放商品的商品棧中
   
    stackpush(goods)
   
    Systemoutprintln(producer product + goods)
   
    //喚醒在stack對象等待池中的等待的所有線程
   
    stacknotifyAll()
   
    }
   
    }
   
    }
   
    public void run() {
   
    produce()
   
    }
   
    }
   
    class Consumer extends Thread {
   
    private Stack stack;
   
    public Stack getStack() {
   
    return stack;
   
    }
   
    public void setStack(Stack stack) {
   
    thisstack = stack;
   
    }
   
    /**
   
    *
   
    * 消費者消費商品當商品棧中為空時通知生產者生產商品
   
    */
   
    public void consume() {
   
    for (int i = ; i < ; i++) {
   
    synchronized (stack) {
   
    Systemoutprintln(consumer get the lock
   
    while (stacksize() == ) {
   
    try {
   
    stackwait()
   
    } catch (InterruptedException e) {
   
    // TODO Autogenerated catch block
   
    eprintStackTrace()
   
    }
   
    }
   
    // 模擬消費者消費商品所需的時間
   
    try {
   
    Threadsleep(
   
    } catch (InterruptedException e) {
   
    // TODO Autogenerated catch block
   
    eprintStackTrace()
   
    }
   
    Object obj = stackpop()
   
    Systemoutprintln(cosumer consume + obj)
   
    }
   
    }
   
    }
   
    public void run() {
   
    consume()
   
    }
   
    }
   
    public class Test{
   
    public static void main(String[] args) {
   
    Stack stack = new Stack()
   
    Consumer consumer = new Consumer()
   
    consumersetStack(stack)
   
    Producer producer = new Producer()
   
    producersetStack(stack)
   
    Producer producer = new Producer()
   
    producersetStack(stack)
   
    consumerstart()producerstart()producerstart()
   
    }
   
    }
From:http://tw.wingwit.com/Article/program/Java/gj/201311/27529.html
    推薦文章
    Copyright © 2005-2013 電腦知識網 Computer Knowledge   All rights reserved.