生产者与消费者(一)
来源:互联网 发布:中央财经大学知乎 编辑:程序博客网 时间:2024/06/06 20:21
首先谈下wait(),notify(),notifyAll(),这个三个方法都是Object里的方法,具体详细作用可以查看API文档:
wait():
/** * Causes the current thread to wait until another thread invokes the * {@link java.lang.Object#notify()} method or the * {@link java.lang.Object#notifyAll()} method for this object, or * some other thread interrupts the current thread, or a certain * amount of real time has elapsed. * <p>notify():
/** * Wakes up a single thread that is waiting on this object's * monitor. If any threads are waiting on this object, one of them * is chosen to be awakened. The choice is arbitrary and occurs at * the discretion of the implementation. A thread waits on an object's * monitor by calling one of the {@code wait} methods. * <p>且这三个方法都是native方法。简单的说明这三个方法作用:
如果对象调用了wait方法就会使持有该对象的线程把该对象的控制权交出去,然后处于等待状态。
如果对象调用了notify方法就会通知某个正在等待这个对象的控制权的线程可以继续运行。
如果对象调用了notifyAll方法就会通知所有等待这个对象控制权的线程继续运行。
关于synchronize与volatile参考之前的文章http://blog.csdn.net/bat_os/article/details/53040490
简单分析下生产者与消费者之间的关系,比如厨师就是生产者,顾客是消费者,服务员按照厨师做好菜的顺序把菜送达。下面用wait,notify解决该问题:
public class Task implements Runnable { private volatile static int i = 0; public void run() { System.out.println("任务" + ++i + "执行完"); }}
/** * Created by diy_os on 2016/11/6. */public class ThreadPool { private static int workThreadNum = 3; private volatile static int FINISH_TASK = 0; private WorkerThread workerThread[]; private List<Runnable> listqueue = new LinkedList<Runnable>(); private static ThreadPool threadPool; public ThreadPool(){ this(workThreadNum);//无参构造器 } public ThreadPool(int workNum){ ThreadPool.workThreadNum = workNum; workerThread = new WorkerThread[workThreadNum]; for(int i=0;i<workThreadNum;i++) { workerThread[i] = new WorkerThread(); workerThread[i].start(); } } public static ThreadPool getThreadPool(){ return new ThreadPool(workThreadNum); } public static ThreadPool getThreadPool(int workThreadNum){ if(threadPool == null){ return new ThreadPool(workThreadNum); } return threadPool; } public void execute(Runnable runnable){ synchronized (listqueue){ listqueue.add(runnable); listqueue.notify(); } } public void execute(Runnable runnable[]){ synchronized (listqueue) { for (Runnable c : runnable) { listqueue.add(c); listqueue.notify(); } } } public void execute(List<Runnable> runnables){ synchronized (listqueue){ for(int i = 0;i<runnables.size();i++) { listqueue.add(runnables.get(i)); } } } public class WorkerThread extends Thread{ boolean isRunning = true; Runnable runnable; public void run(){ while (isRunning){ synchronized (listqueue) { if (isRunning && listqueue.isEmpty()) { try { listqueue.wait(50); } catch (InterruptedException e) { e.printStackTrace(); } } if (!listqueue.isEmpty()) { runnable = listqueue.remove(0); } } if (runnable != null) { runnable.run(); } FINISH_TASK++; runnable = null; } } }}
public class Test { public static void main(String[] args){ ThreadPool threadPool = ThreadPool.getThreadPool(5); threadPool.execute(new Runnable[]{new Task(),new Task(),new Task(),new Task(),new Task(),new Task(),new Task(),new Task(),new Task(),new Task(),new Task(),new Task(),new Task(),new Task(),new Task(),new Task(),new Task(),new Task(),new Task(),new Task(),new Task(),new Task()}); threadPool.execute(new Runnable[]{new Task(),new Task(),new Task(),new Task(),new Task(),new Task(),new Task(),new Task(),new Task(),new Task(),new Task(),new Task(),new Task(),new Task(),new Task(),new Task(),new Task(),new Task(),new Task(),new Task(),new Task(),new Task()}); threadPool.execute(new Runnable[]{new Task(),new Task(),new Task(),new Task(),new Task(),new Task(),new Task(),new Task(),new Task(),new Task(),new Task(),new Task(),new Task(),new Task(),new Task(),new Task(),new Task(),new Task(),new Task(),new Task(),new Task(),new Task()}); }}
0 0
- 生产者与消费者(一)
- java实现生产者与消费者(一)
- 【java多线程】【生产者与消费者】【一】
- 生产者消费者示例一
- 生产者与消费者问题
- 生产者与消费者
- 生产者与消费者
- 生产者与消费者问题
- 消费者与生产者模式
- 消费者与生产者模式
- 消费者与生产者模式
- 生产者与消费者问题
- 生产者与消费者
- 生产者与消费者
- 生产者与消费者
- 生产者与消费者问题
- C# 生产者与消费者
- 生产者与消费者
- 自治事务和变异表的行级触发器部分问题
- IP地址,子网掩码,默认网关,路由总结
- 微信JSSDK 突然出现invalid signature无效签名
- Tomcat的使用(详细流程)
- [ATF]ARMv8 psci cpu off api
- 生产者与消费者(一)
- 菜鸟刷leetcode 19. Remove Nth Node From End of List
- 如何用java写一个简单的记事本。
- Remote Debugging之放开那个webview让我来调戏(试)
- 商城购物车模块-自定义数字加减控件
- log4j将包内的所有类日志指定文件输出
- jsp九大内置对象
- 应用大数据和机器学习技术实现车险全流程智能化的方案(中) -理赔流程智能化改造
- 最长路问题