package com.anda.threads; import java.util.LinkedList; /** * 自定义线程池 * * @author Admin * */ public class ThreadPool extends ThreadGroup { private static boolean isClose = false;// 线程池是否关闭 private static LinkedList workQueue; // 工作队列 private static ThreadPool pool = null; private static Integer num = 0; public static ThreadPool getInstance() { if (pool == null) { pool = new ThreadPool(20); } return pool; } /** * 初始化线程池 * * @param poolSize */ private ThreadPool(int poolSize) { super("zaichi thread pool"); setDaemon(true); workQueue = new LinkedList(); for (int i = 0; i < poolSize; i++) { new WorkThread(i).start(); } } public synchronized void execute(Runnable task) { if (isClose) { throw new IllegalStateException(); } if (task != null) { num++; workQueue.add(task); notify(); } } // 从工作队列中取出一个任务,工作线程会调用该方法 private synchronized Runnable getTask(int threadId) throws InterruptedException { while (workQueue.size() == 0) { if (isClose) { return null; } wait(); // 如果工作线程中没有任务,那么就等待着 } return (Runnable) workQueue.removeFirst(); // 返回队列中的第一个元素,并从队列中删除 } // 等待工作线程把任务执行完成 private void waitFinish() { synchronized (this) { isClose = true; notifyAll(); // 唤醒所有还在getTask()方法中等待任务的工作线程 } Thread[] threads = new Thread[activeCount()]; // activeCount()返回该线程组中活动线程的估计值 int count = enumerate(threads); // enumerate方法继承自ThreadGroup,根据活动的线程的估计值获得该线程组中当前所有活动的工作线程 for (int i = 0; i < count; i++) { // 等待所有工作线程结束 try { threads[i].join(); // 等待工作线程结束 } catch (InterruptedException e) { e.printStackTrace(); } } } // 关闭线程池 public synchronized void closePool() { if (!isClose) { waitFinish(); // 等待工作线程执行完毕 isClose = true; workQueue.clear(); // 清空工作队列 interrupt(); // 中断线程池所有的工作线程 } } /** * 多线程的工作线程 * * @author Admin * */ private class WorkThread extends Thread { private int id; public WorkThread(int id) { super(ThreadPool.this, id + ""); this.id = id; } public void run() { while (!isInterrupted()) { // 继承自Thread,判断线程是否被中断 Runnable task = null; try { task = getTask(id); // 取出任务 } catch (InterruptedException e) { e.printStackTrace(); } // 如果getTask()返回null或者线程执行getTask()时被中断,则结束此线程 if (task == null) { return; } task.run(); // 运行任务 } } } }
相关推荐
1. SpringBoot 自定义线程池以及多线程间的异步调用(@Async、@EnableAsync) 2.Java多线程之定时任务 以及 SpringBoot多线程实现定时任务 3.@EnableScheduling 与 @Scheduled
Java多线程两个例子,一个是自定义线程池方法实现多线程运行个数的控制,可以解决多线程内存不足的问题。另一个是利用线程通信,读写先关的典型实例
Java多线程读取大文本文件并批量插入MongoDB的代码,文本文件,csv文件,可以结合POI改造使其支持excel。 适合做大量文本数据或日志文件入库的场景,大文本被拆分成多个线程处理,速度快。 批量插入MongoDB,存在则...
Java多线程实现 自定义 的 回调函数. 手写 完成,亲测 完成,可以 直接运行,Demo ,具有一定参考价值,供大家阅读 下载,谢谢
主要介绍了Java8并行流中自定义线程池操作,结合实例形式分析了并行流的相关概念、定义及自定义线程池的相关操作技巧,需要的朋友可以参考下
JAVA使用线程池查询大批量数据
本文给大家总结分享了下个人关于java处理自定义线程模型的一些经验和处理方法,有需要的小伙伴可以参考下
Java多线程下载文件,线程数可自定义。 RandomAccessFile的巧妙运用。
Java线程:概念与原理 Java线程:创建与启动 Java线程:线程状态的转换 Java线程:线程的同步与锁 一、同步问题提出 二、同步和锁定 三、静态方法同步 四、如果线程不能不能获得锁会怎么样 五、何时需要同步...
用了一个礼拜时间做了一个端口扫描程序 从扫描同一个网段的IP开始 逐步添加功能 现在还具有了扫描选定IP的常见TCP UDP端口 包括部分常见木马所使用端口 并可以自定义扫描端口 扫描同一网段的IP主要是用...使 [更多]
本文介绍了多线程环境下自增效率比较及原理解析。在多线程环境下,对于...适用于Java开发人员和多线程编程爱好者等人群,内容关键词包括多线程、自增、synchronized、AtomicInteger、LongAdder、LongAccumulator等。
主要介绍了JAVA 自定义线程池的最大线程数设置方法,文中示例代码非常详细,供大家参考和学习,感兴趣的朋友可以了解下
2、支持多任务多线程同时下载; 3、每个任务的线程数由用户在新建任务时自定义,缺省为5个线程; 4、任务下载过程中可以点击“线程+”或“线程-”即时增减线程; 5、选择任务,可以在任务信息栏中查看任务下载的信息...
呕心沥血的java复杂聊天室(包括自定义应用层协议、CS多线程、多客户端登录、上下线提醒等等)。
本篇文章主要介绍了java多线程学习笔记之自定义线程池 ,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
主要介绍了浅谈Java多线程处理中Future的妙用(附源码),还是比较不错的,需要的朋友可以参考下。
目标:Java中多线程技术是一个难点,但是也是一个核心技术。因为Java本身就是一个多线程语言。本人目前在给46班讲授Swing的网络编程--使用Swing来模拟真实的QQ实时聊天软件。因为涉及到Socket编程,所以一定会使用多...
解压后先打开一个命令窗口,在命令行中切换到文件所在路劲路径,然后输入java Server,再打开另一个命令窗口输入java Client (连接后输入go或go2分别发送不同的数据包,客户端输入bye断开连接)
java Swing窗体版多线程下载程序编写示例,多线程下载的实现, 将网络URL中指定的网络文件下载到本地文件中保存。 本代码中将完成新建任务构造器、配置文件构造器,保存下载信息,获取配置文件名,设置在前台显示...