主要逻辑代码:
public class Work { private static final Logger log = Logger.getLogger(Work.class); private boolean isEmpty = true; private List<VchForId> drafts; private long timeout; private ICheckDraftService draftCheckService; public Work() { this.timeout = PropertiesHelper.getProducerThreadWaitTimeout(); } public void setDraftCheckService(ICheckDraftService draftCheckService) { this.draftCheckService = draftCheckService; } public synchronized void addTask() throws InterruptedException { while (true) { if (!(this.isEmpty)) { log.info("任务未完成,暂停生产......"); super.wait(); } log.info("生产线程开始生产"); this.drafts = this.draftCheckService.getWaitingForCheck(); if ((this.drafts == null) || (this.drafts.size() == 0)) { log.info("数据库中不存在需要处理的任务,线程休眠[" + (this.timeout / 1000L) + "]秒......"); super.wait(this.timeout); } log.info("获取到[" + this.drafts.size() + "]笔任务"); this.draftCheckService.setDraftIsChecking(this.drafts); this.isEmpty = false; log.debug("唤醒消费线程......"); super.notifyAll(); log.debug("消费线程唤醒完毕......"); } } public synchronized void getTask() throws InterruptedException { while (true) { if (this.isEmpty) { log.info("无待处理任务,等待生产......"); super.wait(); } log.info("消费线程开始处理任务......"); List taskList = new ArrayList(this.drafts.size()); Iterator it = this.drafts.iterator(); while (it.hasNext()) { VchForId draft = (VchForId)it.next(); log.debug("待核验汇票:" + draft); ICheckDraftService checkService = (ICheckDraftService)SpringHelper.getBean("draftCheckService"); checkService.setDraft(draft); FutureTask task = new FutureTask(checkService); taskList.add(task); ThreadPoolHelper.getInstance().submit(task); } this.drafts = null; join(taskList); this.isEmpty = true; log.debug("唤醒生产线程......"); super.notifyAll(); log.debug("生产线程唤醒完毕......"); } } private void join(List<Future> list) { try { for (Future task : list) task.get(); } catch (ExecutionException e) { log.error("等待线程池中所有任务处理完毕时发生异常!", e); e.printStackTrace(); } catch (InterruptedException e) { log.error("等待线程池中所有任务处理完毕时发生异常!", e); e.printStackTrace(); } } public static void main(String[] args) { Work bean = (Work)SpringHelper.getBean("work"); Producer producer = new Producer(bean); Consumer consumer = new Consumer(bean); producer.start(); consumer.start(); } class Consumer extends Thread { private Work work; public Consumer(Work paramWork) { this.work = paramWork; } public void run() { try { this.work.getTask(); } catch (InterruptedException e) { e.printStackTrace(); log.error(e); } } } class Producer extends Thread { private Work work; public Producer(Work paramWork) { this.work = paramWork; } public void run() { try { this.work.addTask(); } catch (InterruptedException e) { e.printStackTrace(); } } } }
线程池帮助类:
import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; import org.apache.log4j.Logger; public class ThreadPoolHelper { private static final Logger log = Logger.getLogger(ThreadPoolHelper.class); private static int nThreads = (PropertiesHelper.getThreadPoolSize().intValue() > 0) ? PropertiesHelper.getThreadPoolSize().intValue() : Runtime.getRuntime().availableProcessors(); private static ExecutorService exec; private static ExecutorService rebuild() { log.warn("重新构建线程池……"); nThreads = (PropertiesHelper.getThreadPoolSize().intValue() > 0) ? PropertiesHelper.getThreadPoolSize().intValue() : Runtime.getRuntime().availableProcessors(); log.info("Thread Pool Size:" + nThreads); exec = Executors.newFixedThreadPool(nThreads); return exec; } public static ExecutorService getInstance() { if (exec != null) { return exec; } return rebuild(); } static { log.info("Thread Pool Size:" + nThreads); exec = Executors.newFixedThreadPool(nThreads); } }
相关推荐
要理解`java线程池threadpool简单使用源码`,你需要查看`src`目录下的Java文件,了解如何实例化`ThreadPoolExecutor`,设置相关参数,以及如何提交任务到线程池。同时,查看源码中对`ThreadGroup`的使用,理解它如何...
通过上述步骤,我们已经成功地实现了一个简单的自定义Java线程池。虽然这个实现非常基础,但它涵盖了线程池的主要设计思想和技术要点。对于更复杂的应用场景,建议使用成熟的线程池框架,如`ThreadPoolExecutor`,它...
Java线程池是一种高效管理线程的机制,它允许开发者预先设定线程的数量,并通过池化的方式重用已创建的线程,以提高系统性能,减少线程的创建和销毁开销。线程池在Java中是通过`java.util.concurrent`包下的`...
Java线程池是一种高效利用系统资源、管理并发执行任务的机制。...总的来说,理解Java线程池的工作原理和实现对于优化并发应用程序至关重要,它可以帮助我们更好地控制系统的并发度,提高系统的响应速度和资源利用率。
此文档是: 基于简单线程池概念的JAVA服务器端应用 附有连接ORACLE数据库等简单操作. 操作描述: 服务器启动后,会启动10个子线程运行.(配合客户端10个请求进行模拟,控制台输出模拟过程) 服务器主程序进入一个有...
### JAVA线程池应用知识点详解 #### 一、Java线程池概述 线程池是Java多线程编程中的一个重要概念。它通过管理一组多线程的方式,为应用程序提供了一种更加灵活高效的线程管理机制。相比于直接创建线程,使用线程池...
### Java线程池详解 #### 引言 在现代计算机科学中,线程作为轻量级的进程,已经成为操作系统和应用程序提高并发性、优化资源...理解和掌握Java线程池的原理和使用方法,对于开发高性能、高可靠的Java应用至关重要。
Spring Boot 作为一个流行的 Java 框架,提供了许多便捷的功能来帮助开发者快速构建应用程序。其中之一就是使用 Java 线程池 ExecutorService 来管理线程池。今天,我们将深入探讨在 Spring Boot 中使用 Java 线程池...
### Java线程池的使用方式 #### 一、简介 ...通过以上介绍和示例,我们可以看到Java线程池的强大功能及其在实际应用中的重要作用。理解并掌握这些概念将有助于开发者更好地管理和优化多线程应用程序。
Java线程池是一种高效管理线程资源的工具,它的出现是为了优化系统性能,尤其是在需要频繁创建和销毁线程的情况下。由于操作系统创建新线程需要进行内存分配、上下文切换等操作,这涉及到一定的开销。因此,使用...
Java线程池是一种高效管理线程资源的工具,它能够帮助开发者有效地控制并发执行的线程数量,提高系统性能,并确保程序...通过学习和理解这些代码,开发者可以更好地理解和应用Java线程池技术,优化自己的TCP服务程序。
为了防止资源不足,服务器应用程序需要采取一些办法来限制任何给定时刻处理的请求数目,尽可能减少创建和销毁线程的次数,特别是一些资源耗费比较大的线程的创建和销毁,尽量利用已有对象来进行服务,这就是“池化...
基于Java线程池技术实现的Knock Knock游戏项目是一个专为Java开发者设计的实战资源包。它通过实际项目,帮助开发者深入理解并掌握Java语言及线程池技术的应用。该资源包含服务端和客户端两部分,实现了一个简单的...
### 深入理解Java之线程池 #### 一、Java中的`ThreadPoolExecutor`类 在Java中,`ThreadPoolExecutor`是线程池的核心实现类之一,它提供了丰富的配置选项来...通过以上介绍,相信您对Java线程池有了更深入的理解。
### Java线程池的核心概念与实现 #### 一、引言 Java线程池是一种用于管理线程的机制,能够有效提升程序的并发性能。它通过重用预先创建的线程来减少创建新线程所需的开销,同时也能有效地控制运行中的线程数量。...
Java8并行流中自定义线程池操作示例 Java8并行流中自定义线程池操作示例主要介绍了Java8并行流中自定义线程池操作,结合实例形式分析了并行流的相关概念、定义及自定义线程池的相关操作技巧。 1. 概览 Java8引入了...
Java线程池是一种高效利用系统资源的机制,它允许开发者预先配置一定数量的线程,以便在处理任务时能够快速响应。线程池的核心概念在于避免频繁地创建和销毁线程,这可以显著减少系统开销,提升整体性能。本文将深入...
Java线程池是一种管理线程资源的技术,它通过限制系统中执行线程的数量来优化程序性能,避免因频繁创建和销毁线程导致的系统开销。线程池的核心原理是维护一个工作线程集合和一个任务队列。当任务到来时,如果线程池...
Java线程池是一种高效管理并发任务的机制,它在多线程编程中扮演着至关重要的角色。线程池通过预先创建并维护一组可重用线程来提高性能和响应速度,避免频繁创建和销毁线程所带来的开销。在这个"Java-Thread-Pool-...
一个简单的线程池至少包含以下四个关键组成部分: 1. **线程池管理器(ThreadPool Manager)**:负责线程池的创建、销毁以及管理工作。它维护着线程池的状态,控制线程的生命周期,并根据需要调整线程池的大小。 2...