时间:2015-07-29 来源:

线程池的实现 【编程语言】

通常情况下web外包,服务器软件会同时接纳并服务多个用户.当客户请求到达时,web外包服务器主线程会创建一个工作者线程代表服务器为这个客户服务.当用户不需要服务的时候,html前端制作线程结束,div页面并释放创建线程用到的所有资源.当下一个请求到达的时候,承接网页前端外包服务器又会创建一个新的线程为之服务. 但是由于创建线程需要很多资源网页html切图排版,包括处理器、内存等,网页html切图排版这个过程在反复的创建线程中浪费了大量的处理器时间.尤其在大量并发客户的情况下,承接网站前端服务器相应会特别缓慢.这个时候就可以考虑用线程池. 线程池中先预留有一定数量的的线程,html切图报价当有需要的时候,承接网页制作服务器就会从线程池中取出一个工作者线程web外包,将任务赋给线程.当工作者线程执行完任务之后,web外包它将会被重新放回线程池中.注意网页切图制作,任务通常是指一个实现接口runnable的类的实例. 接下来,网页切图制作是一个简单线程池的实现:

版权声明:本文为博主原创文章div+css+js切图,未经博主允许不得转载.

public final class ThreadPool { private static ThreadPool instance = ThreadPool.getInstance(); public static final int SYSTEM_BUSY_TASK_COUNT = 150; //系统繁忙的任务数 /* 默认池中线程数 */ public static int worker_num = 5; /* 已经处理的任务数 */ private static int taskCounter = 0; public static boolean systemIsBusy = false; private static List<Task> taskQueue = Collections .synchronizedList(new LinkedList<Task>()); /* 池中的所有线程 */ public PoolWorker[] workers; private ThreadPool() { workers = new PoolWorker[5]; for (int i = 0; i < workers.length; i++) { workers[i] = new PoolWorker(i); } } /*构造函数*/ private ThreadPool(int pool_worker_num) { worker_num = pool_worker_num; workers = new PoolWorker[worker_num]; for (int i = 0; i < workers.length; i++) { workers[i] = new PoolWorker(i); } } /*通过该函数得到线程池的实例*/ public static synchronized ThreadPool getInstance() { if (instance == null) return new ThreadPool(); return instance; } /** * 增加新的任务 * 每增加一个新任务,网页重构报价都要唤醒任务队列 * @param newTask */ public void addTask(Task newTask) { synchronized (taskQueue) { newTask.setTaskId(++taskCounter); newTask.setSubmitTime(new Date()); taskQueue.add(newTask); /* 唤醒队列承接网站前端, 开始执行 */ taskQueue.notifyAll(); } } /** * 批量增加新任务 * @param taskes */ public void batchAddTask(Task[] taskes) { if (taskes == null || taskes.length == 0) { return; } synchronized (taskQueue) { for (int i = 0; i < taskes.length; i++) { if (taskes[i] == null) { continue; } taskes[i].setTaskId(++taskCounter); taskes[i].setSubmitTime(new Date()); taskQueue.add(taskes[i]); } /* 唤醒队列,承接网站前端 开始执行 */ taskQueue.notifyAll(); } for (int i = 0; i < taskes.length; i++) { if (taskes[i] == null) { continue; } } } /** * 线程池信息 * @return */ public String getInfo() { StringBuffer sb = new StringBuffer(); sb.append("\nTask Queue Size:" + taskQueue.size()); for (int i = 0; i < workers.length; i++) { sb.append("\nWorker " + i + " is " + ((workers[i].isWaiting()) ? "Waiting." : "Running.")); } return sb.toString(); } /** * 销毁线程池 */ public synchronized void destroy() { for (int i = 0; i < worker_num; i++) { workers[i].stopWorker(); workers[i] = null; } taskQueue.clear(); } /** * 池中工作线程(线程池拥有多个线程对象) */ private class PoolWorker extends Thread { private int index = -1; /* 该工作线程是否有效 */ private boolean isRunning = true; /* 该工作线程是否可以执行新任务 */ private boolean isWaiting = true; /*构造函数*/ public PoolWorker(int index) { this.index = index; start(); } public void stopWorker() { this.isRunning = false; } public boolean isWaiting() { return this.isWaiting; } /** * 循环执行任务 * 这也许是线程池的关键所在 */ public void run() { while (isRunning) { Task task = null; synchronized (taskQueue) { while (taskQueue.isEmpty()) { try { /* 任务队列为空psd切图html,则等待有新任务加入从而被唤醒 */ taskQueue.wait(20); } catch (InterruptedException ie) { ie.printStackTrace(); } } /* 取出任务执行 */ task = (Task) taskQueue.remove(0); } if (task != null) { isWaiting = false; try { /* 该任务是否需要立即执行 */ if (task.needExecuteImmediate()) { new Thread(task).start(); //开启新线程执行这个Task } else { System.out.println("一个任务正在执行"); task.run(); //执行这个Task的是同一个线程 } } catch (Exception e) { e.printStackTrace(); } isWaiting = true; task = null; } } } } }

点击次数:5245
作者:
web前端行业资讯
Web new NewsList
谷歌安全博客披露“英特尔内核漏洞”更多细节 ,,2018年01月04日Postgres10开发者新特性 ,,2017年12月28日阿里巴巴、狗尾草、苏大联合论文:基于对抗学习的众包标注用于中文命名实体识别 ,,2017年12月28日柯洁的2017:20岁,与AI斗与人类斗,其乐无穷 ,,2017年12月28日如果机器人拥有痛觉,这个世界会有哪些不一样? ,,2017年12月28日苹果经典电脑Lisa源代码修复完成将于2018年开源 ,,2017年12月28日腾讯浏览指数发布年终榜单2017年人们都关注哪些AI话题? ,,2017年12月28日除了发现开普勒90,NASA还靠AI做了什么? ,,2017年12月28日柯洁宣布:明年4月,将再次与围棋AI交锋 ,,2017年12月28日百度无人车美国首秀CES将发布Apollo2.0 ,,2017年12月28日这四种技术发展趋势将在2018年改变世界 ,,2017年12月28日2017:谷歌DeepMind团队的年度回顾 ,,2017年12月28日封杀这个公式,AI智商将为零 ,,2017年12月28日微软AI高管:要让所有人、所有机构都用上人工智能 ,,2017年12月28日为什么Linux桌面年一直未到来 ,,2017年12月28日AppleLisa操作系统将开源 ,,2017年12月28日2018年9大技术趋势预测 ,,2017年12月28日谷歌研究院发布NIMA:能评价图像有多美,还能让图像变得更美 ,,2017年12月28日苹果为2019年iPhone开发大容量电池新技术 ,,2017年12月28日谷歌发布Tacotron2:能更简单地训练AI学习演讲 ,,2017年12月21日TensorFlow漏洞爆发背后:关于AI安全我们的傻与天真 ,,2017年12月21日Android端Edge浏览器新版发布:常规性能优化和BUG修复 ,,2017年12月21日三星开发出全球最小的DRAM芯片技术领先优势扩大 ,,2017年12月21日腾讯绝艺AI下一步将学习AlphaGozero自对弈训练 ,,2017年12月21日Facebook社交VR应用Spaces扩大覆盖面:入驻HTCVive ,,2017年12月21日设计图曝光:三星双屏折叠手机原来是这样的 ,,2017年12月21日微信支付和支付宝已成为世界移动支付的"老师" ,,2017年12月21日新专利表明FaceID未来有望装备在iPad、MacBook和iMac等设备 ,,2017年12月21日首批九个建议加入EE4J的项目 ,,2017年12月21日这就是SurfacePhone?微软可折叠手机概念图曝光 ,,2017年12月21日什么ARP和ARP欺骗【编程语言】2014年12月09日推荐3个Android筛选器控件【移动开发】2015年08月05日指针与const(C++11) 【移动开发】2015年03月13日【图书管理系统】——要学会抓住机会 【Web前端】2015年06月24日OpenWrtTL-WR841NWAN口down问题【编程语言】2014年12月18日使用VLC和live555MediaServer搭建RTSP服务器【移动开发】2015年04月01日数据结构之单源最短路径(迪杰斯特拉算法)-(九) 【编程语言】2015年05月07日js打字机效果代码2014年01月29日Android中SQLite数据库的简单使用 【移动开发】2015年06月18日poj1328RadarInstallation 【互联网】2015年05月05日js+css使DIV始终居于屏幕中间左下左上右上右下的代码集合2014年01月29日【C#】结构体与类的比较 【编程语言】2015年02月16日Java-帮助文档的制作 【综合】2015年07月09日Facebook引发的HTML5危机 ,,2016年07月24日SDUT1266-出栈序列的统计(DFS) 【编程语言】2014年11月04日Jquery焦点图用于图片展示效果代码2014年01月29日javathissuper使用方法详解2014年01月30日Hibernate基础配置 【编程语言】2015年01月04日IoT跟M2M是一回事吗? 【编程语言】2015年02月16日动态Bean在生产中带来的生产率 【移动开发】2015年05月11日速卖通外国服务器获取订单信息不稳定的解决办法【移动开发】2015年04月17日图解STL内存管理的两种边界情况(STL源码剖析补充) 【系统运维】2014年12月10日php获取后台Job管理的实现代码2014年01月29日MicroX-treme极限运动广告设计欣赏2014年01月28日RubyRailsIDE开发工具RubyMine4.0RC发布, ,,2016年07月24日第十六周项目4-日期结构体(生日相差几天)【编程语言】2014年12月23日360安全卫士3.0正式版下载2014年01月29日OraclePLSQL常用47个工具包 【编程语言】2015年05月25日SpringmvcUEditorjsp版本 【系统运维】2015年02月09日关于UITweener老是卡帧的问题【编程语言】2015年06月02日
我们保证
We guarantee
> psd效果文件手工切图,保证图片效果最好体积最小利于传输
> 100%手写的HTML(DIV+CSS)编码,绝对符合W3C标准
> 代码精简、css沉余量小、搜索引擎扫描迅速,网页打开快捷
> 应用Css Sprite能够减少HTTP请求数,提高网页性能
> 跨浏览器兼容(IE6、7、8、9,Firefox火狐,Chrome谷歌)