Java多线程生产者消费者调度实现
生活随笔
收集整理的這篇文章主要介紹了
Java多线程生产者消费者调度实现
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
生產者消費者模型是多線程中最常見的模型,有著廣泛的應用。其主要目的是實現一種動態的平衡,讓生產者消費者和諧共處,獲得最大化的執行效率。 所說的動態平衡其實就是生產者與消費者協作控制倉儲,讓消費者不至于缺貨,也不能導致不合理不和諧的庫存。 生產者消費者實現最簡單的方式是通過java5之后的線程池來實現,下面的例子很粗糙,但是能良好運行。 在實際應用中,可以基于數據庫,加上復雜邏輯,實現更強悍的后臺處理程序,目前基于此模型構建的后臺程序良好運行,處理效果極佳。 /**?
* 消費者?
*?
* @author leizhimin 12-10-23 下午4:10?
*/?
public?class?MyTask?implements?Runnable{?
????????private?long?id;?
????????public?MyTask(long?id) {?
????????????????this.id = id;?
????????}?
????????@Override?
????????public?void?run() {?
????????????????try?{?
????????????????????????Thread.sleep(100L);?
????????????????}?catch?(InterruptedException e) {?
????????????????????????e.printStackTrace();?
????????????????}?
????????????????System.out.println("\t"+Thread.currentThread().getName()+":"+id);?
????????}?
}?
import?javax.swing.plaf.metal.MetalBorders;?
import?java.util.concurrent.Executors;?
import?java.util.concurrent.ThreadPoolExecutor;?
/**?
* 總調度程序 (包括協作生產)?
*?
* @author leizhimin 12-10-23 下午4:18?
*/?
public?class?TaskPool?extends?Thread {?
????????private?String poolname;?
????????private?ThreadPoolExecutor pool = (ThreadPoolExecutor) Executors.newFixedThreadPool(5);?
????????public?TaskPool(String poolname) {?
????????????????this.poolname = poolname;?
????????}?
????????@Override?
????????public?void?run() {?
????????????????System.out.println(poolname +?":池中的當前線程數getPoolSize()="?+ pool.getPoolSize());?
????????????????int?i = 0;?
????????????????while(true){?
????????????????????????int?x = pool.getQueue().size();?
//????????????????????????System.out.println("返回核心線程數="+pool.getCorePoolSize());?
????????????????????????System.out.println("返回此執行程序使用的任務隊列="+pool.getQueue().size());?
????????????????????????if(x>=5)?
????????????????????????????????try?{?
????????????????????????????????????????Thread.sleep(10L);?
????????????????????????????????????????continue;?
????????????????????????????????}?catch?(InterruptedException e) {?
????????????????????????????????????????e.printStackTrace();?
????????????????????????????????}?
????????????????????????System.out.println(poolname +?"該加入任務了");????????????//生產過程?
????????????????????????for(int?k =i+10;i<k;i++){?
????????????????????????????????pool.submit(new?MyTask(i));?
????????????????????????}?
????????????????}?
????????}?
????????public?static?void?main(String[] args) {?
?????????????????new?TaskPool("pool1").start();?
????????}?
}?
E:\jdk1.6.0_33\bin\java -Didea.launcher.port=7534 -Didea.launcher.bin.path=C:\IDEA11.1.3\bin -Dfile.encoding=UTF-8 -classpath E:\jdk1.6.0_33\jre\lib\charsets.jar;E:\jdk1.6.0_33\jre\lib\deploy.jar;E:\jdk1.6.0_33\jre\lib\javaws.jar;E:\jdk1.6.0_33\jre\lib\jce.jar;E:\jdk1.6.0_33\jre\lib\jsse.jar;E:\jdk1.6.0_33\jre\lib\management-agent.jar;E:\jdk1.6.0_33\jre\lib\plugin.jar;E:\jdk1.6.0_33\jre\lib\resources.jar;E:\jdk1.6.0_33\jre\lib\rt.jar;E:\jdk1.6.0_33\jre\lib\ext\dnsns.jar;E:\jdk1.6.0_33\jre\lib\ext\localedata.jar;E:\jdk1.6.0_33\jre\lib\ext\sunjce_provider.jar;E:\jdk1.6.0_33\jre\lib\ext\sunmscapi.jar;E:\jdk1.6.0_33\jre\lib\ext\sunpkcs11.jar;G:\testprojects\testpool\out\production\testpool;C:\IDEA11.1.3\lib\idea_rt.jar com.intellij.rt.execution.application.AppMain TaskPool?
pool1:池中的當前線程數getPoolSize()=0?
返回此執行程序使用的任務隊列=0?
pool1該加入任務了?
返回此執行程序使用的任務隊列=5?
返回此執行程序使用的任務隊列=5?
返回此執行程序使用的任務隊列=5?
返回此執行程序使用的任務隊列=5?
返回此執行程序使用的任務隊列=5?
返回此執行程序使用的任務隊列=5?
返回此執行程序使用的任務隊列=5?
返回此執行程序使用的任務隊列=5?
返回此執行程序使用的任務隊列=5?
返回此執行程序使用的任務隊列=5?
??pool-1-thread-1:0?
??pool-1-thread-2:1?
??pool-1-thread-5:4?
??pool-1-thread-4:3?
??pool-1-thread-3:2?
返回此執行程序使用的任務隊列=0?
pool1該加入任務了?
返回此執行程序使用的任務隊列=10?
返回此執行程序使用的任務隊列=10?
返回此執行程序使用的任務隊列=10?
返回此執行程序使用的任務隊列=10?
返回此執行程序使用的任務隊列=10?
返回此執行程序使用的任務隊列=10?
返回此執行程序使用的任務隊列=10?
返回此執行程序使用的任務隊列=10?
返回此執行程序使用的任務隊列=10?
??pool-1-thread-1:5?
??pool-1-thread-5:7?
??pool-1-thread-2:6?
??pool-1-thread-3:9?
??pool-1-thread-4:8?
返回此執行程序使用的任務隊列=5?
返回此執行程序使用的任務隊列=5?
返回此執行程序使用的任務隊列=5?
返回此執行程序使用的任務隊列=5?
返回此執行程序使用的任務隊列=5?
返回此執行程序使用的任務隊列=5?
返回此執行程序使用的任務隊列=5?
返回此執行程序使用的任務隊列=5?
返回此執行程序使用的任務隊列=5?
??pool-1-thread-1:10?
返回此執行程序使用的任務隊列=4?
pool1該加入任務了?
返回此執行程序使用的任務隊列=14?
??pool-1-thread-5:11?
??pool-1-thread-4:14?
??pool-1-thread-3:13?
??pool-1-thread-2:12?
返回此執行程序使用的任務隊列=10?
返回此執行程序使用的任務隊列=10?
返回此執行程序使用的任務隊列=10?
返回此執行程序使用的任務隊列=10?
返回此執行程序使用的任務隊列=10?
返回此執行程序使用的任務隊列=10?
返回此執行程序使用的任務隊列=10?
返回此執行程序使用的任務隊列=10?
返回此執行程序使用的任務隊列=10?
??pool-1-thread-1:15?
??pool-1-thread-4:17?
??pool-1-thread-3:18?
??pool-1-thread-2:19?
??pool-1-thread-5:16?
返回此執行程序使用的任務隊列=5?
返回此執行程序使用的任務隊列=5?
返回此執行程序使用的任務隊列=5?
返回此執行程序使用的任務隊列=5?
返回此執行程序使用的任務隊列=5?
返回此執行程序使用的任務隊列=5?
返回此執行程序使用的任務隊列=5?
返回此執行程序使用的任務隊列=5?
返回此執行程序使用的任務隊列=5?
??pool-1-thread-1:20?
??pool-1-thread-2:23?
??pool-1-thread-5:24?
??pool-1-thread-3:22?
??pool-1-thread-4:21?
返回此執行程序使用的任務隊列=0?
pool1該加入任務了?
返回此執行程序使用的任務隊列=10?
返回此執行程序使用的任務隊列=10?
返回此執行程序使用的任務隊列=10?
返回此執行程序使用的任務隊列=10?
返回此執行程序使用的任務隊列=10?
返回此執行程序使用的任務隊列=10?
返回此執行程序使用的任務隊列=10?
返回此執行程序使用的任務隊列=10?
返回此執行程序使用的任務隊列=10?
返回此執行程序使用的任務隊列=10?
??pool-1-thread-1:25?
??pool-1-thread-2:26?
??pool-1-thread-3:28?
??pool-1-thread-5:27?
??pool-1-thread-4:29?
返回此執行程序使用的任務隊列=5?
返回此執行程序使用的任務隊列=5?
返回此執行程序使用的任務隊列=5?
返回此執行程序使用的任務隊列=5?
返回此執行程序使用的任務隊列=5?
返回此執行程序使用的任務隊列=5?
返回此執行程序使用的任務隊列=5?
返回此執行程序使用的任務隊列=5?
返回此執行程序使用的任務隊列=5?
??pool-1-thread-1:30?
??pool-1-thread-4:34?
??pool-1-thread-3:32?
??pool-1-thread-5:33?
??pool-1-thread-2:31?
返回此執行程序使用的任務隊列=0?
pool1該加入任務了?
返回此執行程序使用的任務隊列=10?
返回此執行程序使用的任務隊列=10?
返回此執行程序使用的任務隊列=10?
返回此執行程序使用的任務隊列=10?
返回此執行程序使用的任務隊列=10?
返回此執行程序使用的任務隊列=10?
返回此執行程序使用的任務隊列=10?
返回此執行程序使用的任務隊列=10?
返回此執行程序使用的任務隊列=10?
??pool-1-thread-1:35?
??pool-1-thread-4:36?
??pool-1-thread-3:37?
??pool-1-thread-2:39?
??pool-1-thread-5:38?
返回此執行程序使用的任務隊列=5?
返回此執行程序使用的任務隊列=5?
返回此執行程序使用的任務隊列=5?
返回此執行程序使用的任務隊列=5?
返回此執行程序使用的任務隊列=5?
返回此執行程序使用的任務隊列=5?
返回此執行程序使用的任務隊列=5?
返回此執行程序使用的任務隊列=5?
返回此執行程序使用的任務隊列=5?
返回此執行程序使用的任務隊列=5?
??pool-1-thread-1:40?
??pool-1-thread-5:44?
??pool-1-thread-2:43?
??pool-1-thread-3:42?
??pool-1-thread-4:41?
返回此執行程序使用的任務隊列=0?
pool1該加入任務了?
返回此執行程序使用的任務隊列=10?
返回此執行程序使用的任務隊列=10?
返回此執行程序使用的任務隊列=10?
返回此執行程序使用的任務隊列=10?
返回此執行程序使用的任務隊列=10?
返回此執行程序使用的任務隊列=10?
返回此執行程序使用的任務隊列=10?
返回此執行程序使用的任務隊列=10?
返回此執行程序使用的任務隊列=10?
??pool-1-thread-1:45?
??pool-1-thread-2:47?
??pool-1-thread-3:48?
??pool-1-thread-5:46?
??pool-1-thread-4:49?
返回此執行程序使用的任務隊列=5?
返回此執行程序使用的任務隊列=5?
返回此執行程序使用的任務隊列=5?
返回此執行程序使用的任務隊列=5?
返回此執行程序使用的任務隊列=5?
返回此執行程序使用的任務隊列=5?
返回此執行程序使用的任務隊列=5?
返回此執行程序使用的任務隊列=5?
返回此執行程序使用的任務隊列=5?
??pool-1-thread-1:50?
返回此執行程序使用的任務隊列=4?
pool1該加入任務了?
返回此執行程序使用的任務隊列=14?
??pool-1-thread-5:53?
??pool-1-thread-3:52?
??pool-1-thread-4:54?
??pool-1-thread-2:51?
返回此執行程序使用的任務隊列=10?
返回此執行程序使用的任務隊列=10 。。。。。 可以看到,庫存永遠不會超過14。 太忙了,沒空詳細寫,如果你有不同的見解,請留下代碼,不要對作者本人進行攻擊評論。謝謝各位!
本文轉自 leizhimin 51CTO博客,原文鏈接:http://blog.51cto.com/lavasoft/1036186,如需轉載請自行聯系原作者
* 消費者?
*?
* @author leizhimin 12-10-23 下午4:10?
*/?
public?class?MyTask?implements?Runnable{?
????????private?long?id;?
????????public?MyTask(long?id) {?
????????????????this.id = id;?
????????}?
????????@Override?
????????public?void?run() {?
????????????????try?{?
????????????????????????Thread.sleep(100L);?
????????????????}?catch?(InterruptedException e) {?
????????????????????????e.printStackTrace();?
????????????????}?
????????????????System.out.println("\t"+Thread.currentThread().getName()+":"+id);?
????????}?
}?
import?javax.swing.plaf.metal.MetalBorders;?
import?java.util.concurrent.Executors;?
import?java.util.concurrent.ThreadPoolExecutor;?
/**?
* 總調度程序 (包括協作生產)?
*?
* @author leizhimin 12-10-23 下午4:18?
*/?
public?class?TaskPool?extends?Thread {?
????????private?String poolname;?
????????private?ThreadPoolExecutor pool = (ThreadPoolExecutor) Executors.newFixedThreadPool(5);?
????????public?TaskPool(String poolname) {?
????????????????this.poolname = poolname;?
????????}?
????????@Override?
????????public?void?run() {?
????????????????System.out.println(poolname +?":池中的當前線程數getPoolSize()="?+ pool.getPoolSize());?
????????????????int?i = 0;?
????????????????while(true){?
????????????????????????int?x = pool.getQueue().size();?
//????????????????????????System.out.println("返回核心線程數="+pool.getCorePoolSize());?
????????????????????????System.out.println("返回此執行程序使用的任務隊列="+pool.getQueue().size());?
????????????????????????if(x>=5)?
????????????????????????????????try?{?
????????????????????????????????????????Thread.sleep(10L);?
????????????????????????????????????????continue;?
????????????????????????????????}?catch?(InterruptedException e) {?
????????????????????????????????????????e.printStackTrace();?
????????????????????????????????}?
????????????????????????System.out.println(poolname +?"該加入任務了");????????????//生產過程?
????????????????????????for(int?k =i+10;i<k;i++){?
????????????????????????????????pool.submit(new?MyTask(i));?
????????????????????????}?
????????????????}?
????????}?
????????public?static?void?main(String[] args) {?
?????????????????new?TaskPool("pool1").start();?
????????}?
}?
E:\jdk1.6.0_33\bin\java -Didea.launcher.port=7534 -Didea.launcher.bin.path=C:\IDEA11.1.3\bin -Dfile.encoding=UTF-8 -classpath E:\jdk1.6.0_33\jre\lib\charsets.jar;E:\jdk1.6.0_33\jre\lib\deploy.jar;E:\jdk1.6.0_33\jre\lib\javaws.jar;E:\jdk1.6.0_33\jre\lib\jce.jar;E:\jdk1.6.0_33\jre\lib\jsse.jar;E:\jdk1.6.0_33\jre\lib\management-agent.jar;E:\jdk1.6.0_33\jre\lib\plugin.jar;E:\jdk1.6.0_33\jre\lib\resources.jar;E:\jdk1.6.0_33\jre\lib\rt.jar;E:\jdk1.6.0_33\jre\lib\ext\dnsns.jar;E:\jdk1.6.0_33\jre\lib\ext\localedata.jar;E:\jdk1.6.0_33\jre\lib\ext\sunjce_provider.jar;E:\jdk1.6.0_33\jre\lib\ext\sunmscapi.jar;E:\jdk1.6.0_33\jre\lib\ext\sunpkcs11.jar;G:\testprojects\testpool\out\production\testpool;C:\IDEA11.1.3\lib\idea_rt.jar com.intellij.rt.execution.application.AppMain TaskPool?
pool1:池中的當前線程數getPoolSize()=0?
返回此執行程序使用的任務隊列=0?
pool1該加入任務了?
返回此執行程序使用的任務隊列=5?
返回此執行程序使用的任務隊列=5?
返回此執行程序使用的任務隊列=5?
返回此執行程序使用的任務隊列=5?
返回此執行程序使用的任務隊列=5?
返回此執行程序使用的任務隊列=5?
返回此執行程序使用的任務隊列=5?
返回此執行程序使用的任務隊列=5?
返回此執行程序使用的任務隊列=5?
返回此執行程序使用的任務隊列=5?
??pool-1-thread-1:0?
??pool-1-thread-2:1?
??pool-1-thread-5:4?
??pool-1-thread-4:3?
??pool-1-thread-3:2?
返回此執行程序使用的任務隊列=0?
pool1該加入任務了?
返回此執行程序使用的任務隊列=10?
返回此執行程序使用的任務隊列=10?
返回此執行程序使用的任務隊列=10?
返回此執行程序使用的任務隊列=10?
返回此執行程序使用的任務隊列=10?
返回此執行程序使用的任務隊列=10?
返回此執行程序使用的任務隊列=10?
返回此執行程序使用的任務隊列=10?
返回此執行程序使用的任務隊列=10?
??pool-1-thread-1:5?
??pool-1-thread-5:7?
??pool-1-thread-2:6?
??pool-1-thread-3:9?
??pool-1-thread-4:8?
返回此執行程序使用的任務隊列=5?
返回此執行程序使用的任務隊列=5?
返回此執行程序使用的任務隊列=5?
返回此執行程序使用的任務隊列=5?
返回此執行程序使用的任務隊列=5?
返回此執行程序使用的任務隊列=5?
返回此執行程序使用的任務隊列=5?
返回此執行程序使用的任務隊列=5?
返回此執行程序使用的任務隊列=5?
??pool-1-thread-1:10?
返回此執行程序使用的任務隊列=4?
pool1該加入任務了?
返回此執行程序使用的任務隊列=14?
??pool-1-thread-5:11?
??pool-1-thread-4:14?
??pool-1-thread-3:13?
??pool-1-thread-2:12?
返回此執行程序使用的任務隊列=10?
返回此執行程序使用的任務隊列=10?
返回此執行程序使用的任務隊列=10?
返回此執行程序使用的任務隊列=10?
返回此執行程序使用的任務隊列=10?
返回此執行程序使用的任務隊列=10?
返回此執行程序使用的任務隊列=10?
返回此執行程序使用的任務隊列=10?
返回此執行程序使用的任務隊列=10?
??pool-1-thread-1:15?
??pool-1-thread-4:17?
??pool-1-thread-3:18?
??pool-1-thread-2:19?
??pool-1-thread-5:16?
返回此執行程序使用的任務隊列=5?
返回此執行程序使用的任務隊列=5?
返回此執行程序使用的任務隊列=5?
返回此執行程序使用的任務隊列=5?
返回此執行程序使用的任務隊列=5?
返回此執行程序使用的任務隊列=5?
返回此執行程序使用的任務隊列=5?
返回此執行程序使用的任務隊列=5?
返回此執行程序使用的任務隊列=5?
??pool-1-thread-1:20?
??pool-1-thread-2:23?
??pool-1-thread-5:24?
??pool-1-thread-3:22?
??pool-1-thread-4:21?
返回此執行程序使用的任務隊列=0?
pool1該加入任務了?
返回此執行程序使用的任務隊列=10?
返回此執行程序使用的任務隊列=10?
返回此執行程序使用的任務隊列=10?
返回此執行程序使用的任務隊列=10?
返回此執行程序使用的任務隊列=10?
返回此執行程序使用的任務隊列=10?
返回此執行程序使用的任務隊列=10?
返回此執行程序使用的任務隊列=10?
返回此執行程序使用的任務隊列=10?
返回此執行程序使用的任務隊列=10?
??pool-1-thread-1:25?
??pool-1-thread-2:26?
??pool-1-thread-3:28?
??pool-1-thread-5:27?
??pool-1-thread-4:29?
返回此執行程序使用的任務隊列=5?
返回此執行程序使用的任務隊列=5?
返回此執行程序使用的任務隊列=5?
返回此執行程序使用的任務隊列=5?
返回此執行程序使用的任務隊列=5?
返回此執行程序使用的任務隊列=5?
返回此執行程序使用的任務隊列=5?
返回此執行程序使用的任務隊列=5?
返回此執行程序使用的任務隊列=5?
??pool-1-thread-1:30?
??pool-1-thread-4:34?
??pool-1-thread-3:32?
??pool-1-thread-5:33?
??pool-1-thread-2:31?
返回此執行程序使用的任務隊列=0?
pool1該加入任務了?
返回此執行程序使用的任務隊列=10?
返回此執行程序使用的任務隊列=10?
返回此執行程序使用的任務隊列=10?
返回此執行程序使用的任務隊列=10?
返回此執行程序使用的任務隊列=10?
返回此執行程序使用的任務隊列=10?
返回此執行程序使用的任務隊列=10?
返回此執行程序使用的任務隊列=10?
返回此執行程序使用的任務隊列=10?
??pool-1-thread-1:35?
??pool-1-thread-4:36?
??pool-1-thread-3:37?
??pool-1-thread-2:39?
??pool-1-thread-5:38?
返回此執行程序使用的任務隊列=5?
返回此執行程序使用的任務隊列=5?
返回此執行程序使用的任務隊列=5?
返回此執行程序使用的任務隊列=5?
返回此執行程序使用的任務隊列=5?
返回此執行程序使用的任務隊列=5?
返回此執行程序使用的任務隊列=5?
返回此執行程序使用的任務隊列=5?
返回此執行程序使用的任務隊列=5?
返回此執行程序使用的任務隊列=5?
??pool-1-thread-1:40?
??pool-1-thread-5:44?
??pool-1-thread-2:43?
??pool-1-thread-3:42?
??pool-1-thread-4:41?
返回此執行程序使用的任務隊列=0?
pool1該加入任務了?
返回此執行程序使用的任務隊列=10?
返回此執行程序使用的任務隊列=10?
返回此執行程序使用的任務隊列=10?
返回此執行程序使用的任務隊列=10?
返回此執行程序使用的任務隊列=10?
返回此執行程序使用的任務隊列=10?
返回此執行程序使用的任務隊列=10?
返回此執行程序使用的任務隊列=10?
返回此執行程序使用的任務隊列=10?
??pool-1-thread-1:45?
??pool-1-thread-2:47?
??pool-1-thread-3:48?
??pool-1-thread-5:46?
??pool-1-thread-4:49?
返回此執行程序使用的任務隊列=5?
返回此執行程序使用的任務隊列=5?
返回此執行程序使用的任務隊列=5?
返回此執行程序使用的任務隊列=5?
返回此執行程序使用的任務隊列=5?
返回此執行程序使用的任務隊列=5?
返回此執行程序使用的任務隊列=5?
返回此執行程序使用的任務隊列=5?
返回此執行程序使用的任務隊列=5?
??pool-1-thread-1:50?
返回此執行程序使用的任務隊列=4?
pool1該加入任務了?
返回此執行程序使用的任務隊列=14?
??pool-1-thread-5:53?
??pool-1-thread-3:52?
??pool-1-thread-4:54?
??pool-1-thread-2:51?
返回此執行程序使用的任務隊列=10?
返回此執行程序使用的任務隊列=10 。。。。。 可以看到,庫存永遠不會超過14。 太忙了,沒空詳細寫,如果你有不同的見解,請留下代碼,不要對作者本人進行攻擊評論。謝謝各位!
本文轉自 leizhimin 51CTO博客,原文鏈接:http://blog.51cto.com/lavasoft/1036186,如需轉載請自行聯系原作者
總結
以上是生活随笔為你收集整理的Java多线程生产者消费者调度实现的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: OpenStack icehouse系列
- 下一篇: 升级 Visual Studio 201