线程池总结
2015-07-14 15:19
274 查看
线程池总结:
1、线程池内部原理解析
/article/4783974.html
线程池是根据线程池大小并发执行
2、系统自带4中线程池
http://www.trinea.cn/android/java-android-thread-pool/
下面是main函数测试以上两片代码
参考文章链接
/article/8341111.html
1、线程池内部原理解析
/article/4783974.html
线程池是根据线程池大小并发执行
package com.example.ivanThreadPoolTest; import java.util.LinkedList; import java.util.List; import java.util.concurrent.ThreadPoolExecutor; public final class ThreadPool { // 线程池中默认线程的个数为5 private static int worker_num = 5; // 工作线程 private WorkThread[] workThreads; // 任务队列,作为一个缓冲,List线程不安全 private List<Runnable> taskQueue = new LinkedList<Runnable>(); private static ThreadPool threadPool; // 创建具有默认线程个数的线程池 public ThreadPool() { this(5); } // 创建线程池,worker_num为线程池中工作线程的个数 private ThreadPool(int worker_num) { ThreadPool.worker_num = worker_num; workThreads = new WorkThread[worker_num]; for (int i = 0; i < worker_num; i++) { workThreads[i] = new WorkThread(); workThreads[i].start();// 开启线程池中的线程 } } // 单态模式,获得一个默认线程个数的线程池 public static ThreadPool getThreadPool() { return getThreadPool(ThreadPool.worker_num); } // 单态模式,获得一个指定线程个数的线程池,worker_num(>0)为线程池中工作线程的个数 // worker_num<=0创建默认的工作线程个数 public static ThreadPool getThreadPool(int worker_num1) { if (threadPool == null) threadPool = new ThreadPool(worker_num1); return threadPool; } // 执行任务,其实只是把任务加入任务队列,什么时候执行有线程池管理器觉定 public void addTask(Runnable task) { synchronized (taskQueue) { taskQueue.add(task); taskQueue.notifyAll(); } } // 销毁线程池,该方法保证在所有任务都完成的情况下才销毁所有线程,否则等待任务完成才销毁 public void destroy() { while (!taskQueue.isEmpty()) {// 如果还有任务没执行完成,就先睡会吧 try { Thread.sleep(10); } catch (InterruptedException e) { e.printStackTrace(); } } // 工作线程停止工作,且置为null for (int i = 0; i < worker_num; i++) { workThreads[i].stopWorker(); workThreads[i] = null; } threadPool = null; taskQueue.clear();// 清空任务队列 } /** * 内部类,工作线程 */ private class WorkThread extends Thread { // 该工作线程是否有效,用于结束该工作线程 private boolean isRunning = true; /* * 关键所在啊,如果任务队列不空,则取出任务执行,若任务队列空,则等待 */ @Override public void run() { Runnable r = null; while (isRunning) {// 注意,若线程无效则自然结束run方法,该线程就没用了 synchronized (taskQueue) { while (isRunning && taskQueue.isEmpty()) {// 队列为空 try { taskQueue.wait(20); } catch (InterruptedException e) { e.printStackTrace(); } } if (!taskQueue.isEmpty()) r = taskQueue.remove(0);// 取出任务 } if (r != null) { r.run();// 执行任务 } r = null; } } // 停止工作,让该线程自然执行完run方法,自然结束 public void stopWorker() { isRunning = false; } } }
2、系统自带4中线程池
http://www.trinea.cn/android/java-android-thread-pool/
package com.example.ivanThreadPoolTest; import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; import java.util.concurrent.ScheduledExecutorService; import java.util.concurrent.TimeUnit; public class SystemExecutors { /** * 创建一个可缓存线程池,如果线程池长度超过处理需要,可灵活回收空闲线程,若无可回收,则新建线程。 */ public void cachedThreadPool (){ ExecutorService cachedThreadPool = Executors.newCachedThreadPool(); for (int i = 0; i < 10; i++) { final int index = i; // try { // Thread.sleep(index * 1000); // } catch (InterruptedException e) { // e.printStackTrace(); // } cachedThreadPool.execute(new Runnable() { @Override public void run() { System.out.println(index); } }); } } /** * 创建一个定长线程池,可控制线程最大并发数,超出的线程会在队列中等待 */ public void newFixedThreadPool(){ ExecutorService fixedThreadPool = Executors.newFixedThreadPool(3); for (int i = 0; i < 10; i++) { final int index = i; fixedThreadPool.execute(new Runnable() { @Override public void run() { try { System.out.println(index); Thread.sleep(2000); } catch (InterruptedException e) { // TODO Auto-generated catch block e.printStackTrace(); } } }); } } /** * 创建一个定长线程池,支持定时及周期性任务执行。延迟执行示例代码如下 */ public void newScheduledThreadPool(){ ScheduledExecutorService scheduledThreadPool = Executors.newScheduledThreadPool(5); scheduledThreadPool.schedule(new Runnable() { @Override public void run() { System.out.println("delay 3 seconds"); } }, 3, TimeUnit.SECONDS); } /** * 定期执行示例代码如下: * 表示延迟1秒后每3秒执行一次。 * ScheduledExecutorService比Timer更安全,功能更强大,后面会有一篇单独进行对比。 */ public void newScheduledThreadPool2(){ ScheduledExecutorService scheduledThreadPool = Executors.newScheduledThreadPool(5); scheduledThreadPool.scheduleAtFixedRate(new Runnable() { @Override public void run() { System.out.println("delay 1 seconds, and excute every 3 seconds"); } }, 1, 3, TimeUnit.SECONDS); } /** * 创建一个单线程化的线程池,它只会用唯一的工作线程来执行任务,保证所有任务按照指定顺序(FIFO, LIFO, 优先级)执行 */ public void newSingleThreadExecutor(){ ExecutorService singleThreadExecutor = Executors.newSingleThreadExecutor(); for (int i = 0; i < 10; i++) { final int index = i; singleThreadExecutor.execute(new Runnable() { @Override public void run() { try { System.out.println(index); Thread.sleep(2000); } catch (InterruptedException e) { // TODO Auto-generated catch block e.printStackTrace(); } } }); } } }
下面是main函数测试以上两片代码
package com.example.ivanThreadPoolTest; public class MainTest { public static void main(String[] args) { ThreadPoolTest(); // new SystemExecutors().cachedThreadPool(); // new SystemExecutors().newFixedThreadPool(); // new SystemExecutors().newScheduledThreadPool(); // new SystemExecutors().newScheduledThreadPool2(); // new SystemExecutors().newSingleThreadExecutor(); } public static void ThreadPoolTest(){ ThreadPool pool; pool = ThreadPool.getThreadPool(); for(int i = 0 ; i <10 ; i++){ final int index = i; Runnable r = new Runnable() { @Override public void run() { System.out.println(index); } }; pool.addTask(r); } } }
参考文章链接
/article/8341111.html
相关文章推荐
- libxml/tree.h file not found
- Codeforces Round #273 (Div. 2) C.Table Decorations 贪心
- 动画类型
- 一些思考 以及胡乱写的韵脚
- vcruntime140.dll丢失问题处理
- Js 学习资料
- 动画类型 分类: Android 2015-07-14 15:19 8人阅读 评论(0) 收藏
- Variant
- SNMP监控一些常用OID的总结
- SpringMVC实战(注解)
- Scala快速排序算法解析
- Markdown Pad 2 注册码
- OSGI Buleprint(7)
- C# 类中索引器的使用
- Linux 系统实现源地址路由
- 新的Blog
- Project Euler:Problem 62 Cubic permutations
- 动画
- Android 断开电源10秒后自动关机
- Excel导入功能(Ajaxfileupload)