Java通过wait()和notifyAll()方法实现线程间的通信详解编程语言

Java代码(使用了2个内部类):

package Threads; 
 
import java.util.LinkedList; 
 
/** 
 * Created by Frank 
 */ 
public class ProdCons { 
    protected LinkedList<Object> list = new LinkedList<>(); 
    protected int max; 
    protected boolean done = false; 
 
    public static void main(String[] args) throws InterruptedException { 
        ProdCons prodCons = new ProdCons(100, 3, 4); 
        Thread.sleep(5 * 1000); 
        synchronized (prodCons.list) { 
            prodCons.done = true; 
            try { 
                prodCons.notifyAll(); 
            } catch (Exception ex) { 
            } 
        } 
    } 
 
    private ProdCons(int maxThreads, int nP, int nC) { 
        this.max = maxThreads; 
        for (int i = 0; i < nP; i++) { 
            new Producer().start(); 
        } 
        for (int i = 0; i < nC; i++) { 
            new Consumer().start(); 
        } 
    } 
 
    class Producer extends Thread { 
        public void run() { 
            while (true) { 
                Object justProduced = null; 
                try { 
                    justProduced = getObj(); 
                } catch (InterruptedException e) { 
                    e.printStackTrace(); 
                } 
                synchronized (list) { 
                    while (list.size() == max) { 
                        try { 
                            list.wait(); 
                        } catch (InterruptedException e) { 
                            System.out.println("Producer INTERRUPTED"); 
                        } 
                    } 
                    list.addFirst(justProduced); 
                    list.notifyAll(); 
                    System.out.println("Produced 1;List size now " + list.size()); 
                    if (done) { 
                        break; 
                    } 
                } 
            } 
        } 
    } 
 
    class Consumer extends Thread { 
        public void run() { 
            while (true) { 
                Object object = null; 
                synchronized (list) { 
                    if (list.size() == 0) { 
                        try { 
                            list.wait(); 
                        } catch (InterruptedException e) { 
                            System.out.println("Consumer INTERRUPTED"); 
                        } 
                    } 
                    if (list.size() > 0) { 
                        object = list.removeLast(); 
                    } 
                    list.notifyAll(); 
                    System.out.println("List size now " + list.size()); 
                    if (done) { 
                        break; 
                    } 
                } 
                if (null != object) { 
                    System.out.println("Consuming object " + object); 
                } 
            } 
        } 
    } 
 
    private Object getObj() throws InterruptedException { 
        Thread.sleep(1000); 
        return new Object(); 
    } 
}

 

原创文章,作者:ItWorker,如若转载,请注明出处:https://blog.ytso.com/15854.html

(0)
上一篇 2021年7月19日
下一篇 2021年7月19日

相关推荐

发表回复

登录后才能评论