package com.anyec.zk; import java.util.HashMap; import java.util.HashSet; import java.util.Map; import java.util.Random; import java.util.Set; import java.util.Timer; import java.util.TimerTask; import java.util.concurrent.ArrayBlockingQueue; import java.util.concurrent.BlockingQueue; import java.util.concurrent.Callable; import java.util.concurrent.ConcurrentHashMap; import java.util.concurrent.ConcurrentMap; import java.util.concurrent.ExecutionException; import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; import java.util.concurrent.Future; import java.util.concurrent.FutureTask; import java.util.concurrent.LinkedBlockingQueue; import java.util.concurrent.SynchronousQueue; import java.util.concurrent.ThreadPoolExecutor; import java.util.concurrent.TimeUnit; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import com.alibaba.fastjson.JSONObject; public class AsyncQueFutherTask { Logger logger=LoggerFactory.getLogger(AsyncQueFutherTask.class); Random r = new Random(); private static BlockingQueue<Long> bq = new LinkedBlockingQueue<Long>(20); // private final static ThreadPoolExecutor ses = new ThreadPoolExecutor(20, 40, 1L, TimeUnit.MINUTES, // new ArrayBlockingQueue<Runnable>(100), new ThreadPoolExecutor.DiscardPolicy()); // ExecutorService ses =new ThreadPoolExecutor(20, 40, 1L, TimeUnit.MINUTES, // new ArrayBlockingQueue<Runnable>(1), new ThreadPoolExecutor.DiscardOldestPolicy()); ExecutorService ses=Executors.newCachedThreadPool(); // ExecutorService ses=Executors.newFixedThreadPool(20); // ExecutorService ses=new ThreadPoolExecutor(0, 200, // 60L, TimeUnit.SECONDS, // new SynchronousQueue<Runnable>()); static ConcurrentMap<Long, FutureTask2<JSONObject>> orderFutureMap = new ConcurrentHashMap<Long, FutureTask2<JSONObject>>( 64, 0.75f, 1); Timer timer = new Timer(); static int count = 0; public void init() { timer.schedule(new TimerTask() { @Override public void run() { count++; // logger.info("第"+count+"次开始执行"); Set<Long> orderIds = new HashSet<>(); // Iterator<Long> it = bq.iterator(); // while (!bq.isEmpty()) { // orderIds.add(bq.poll()); // } bq.drainTo(orderIds,100); Map<Long, JSONObject> rmap = mapByIds(orderIds); for (Long orderId : orderIds) { FutureTask2<JSONObject> f = orderFutureMap.get(orderId); JSONObject jo = rmap.get(orderId); if (f != null) { f.set(jo); } else { logger.info(orderId + " FutureTask2 is null"); } } rmap.clear(); rmap = null; // logger.info("第"+count+"次执行结束"+orderIds.size()); } }, 10 * 1000, 100); } public Map<Long, JSONObject> mapByIds(Set<Long> orderIds) { Map<Long, JSONObject> map = new HashMap<>(); for (Long orderId : orderIds) { JSONObject jo = new JSONObject(); jo.put("orderId", orderId); jo.put("orderNum", r.nextInt(200)); map.put(orderId, jo); } return map; } public JSONObject queryOrder(Long orderId) { FutureTask2<JSONObject> ft = new FutureTask2<JSONObject>(new Callable<JSONObject>() { @Override public JSONObject call() throws Exception { JSONObject jo = orderFutureMap.get(orderId).get(); orderFutureMap.remove(orderId); return jo; } }); try { orderFutureMap.put(orderId, ft); bq.put(orderId); } catch (InterruptedException e1) { e1.printStackTrace(); } ft.setOrderId(orderId); Future<JSONObject> f = (Future<JSONObject>) ses.submit(ft); JSONObject jo = null; try { jo = ft.get(); orderFutureMap.remove(orderId); } catch (InterruptedException | ExecutionException e) { e.printStackTrace(); } if (jo == null) { jo = new JSONObject(); } logger.info(orderId + " 执行结果 " + jo.toJSONString()); return jo; } public static void main(String[] args) { int i = 1; AsyncQueFutherTask task = new AsyncQueFutherTask(); task.init(); try { Thread.sleep(10 * 1000); } catch (InterruptedException e) { e.printStackTrace(); } while (i < 100000) { int j = ++i; new Thread(new Runnable() { @Override public void run() { task.queryOrder(new Long(j)); } }).start(); } } } class FutureTask2<T> extends FutureTask<T> { private Long orderId; public FutureTask2(Callable<T> callable) { super(callable); } public FutureTask2(Runnable runnable, T result) { super(runnable, result); } public Long getOrderId() { return orderId; } public void setOrderId(Long orderId) { this.orderId = orderId; } public void set(T v) { super.set(v); } } class Param { }
相关推荐
在Java编程中,多线程查询数据库是一种常见的优化策略,特别是在处理大数据量或者需要并行执行多个查询时。本文将详细探讨如何利用Java的多线程技术和线程池来实现并发查询数据库,以及相关的文件`BatchDataUtil....
多线程技术与分页查询相结合,可以有效地解决这一问题,提高系统性能并优化用户体验。以下是对标题和描述中涉及知识点的详细解释: 1. **大数据量处理**:当数据库中的数据达到百万甚至亿级时,单线程查询可能导致...
为了解决这个问题,我们可以采用各种合并策略,其中一种是通过多线程并行合并小文件。本项目提供的工具类就基于orc格式,利用了snappy或zlib压缩,用于在Flink中自定义合并orc小文件。 orc是一种高效的列式存储格式...
FileSplitter4Linux_多线程文件分割合并器.7z =========================================== 多线程文件分割、合并器 v2.0.1 for Windows / Linux
4. **结果合并**:所有线程完成后,主线程收集并合并查询结果,呈现给用户。 **六、注意事项** 在实现多线程查询时,开发者需要注意以下几点: - **异常处理**:确保每个线程都有适当的错误处理机制,以防数据库...
在Java编程中,多线程是并发处理任务的关键技术,特别是在高性能、高并发的应用场景下。本篇将探讨“多线程结果组装”的主题,它涉及到如何在多个并发执行的任务完成后,有效地收集并整合这些任务的结果。这个过程...
在IT行业中,多线程并行执行是一种常见的优化策略,特别是在处理大数据量或者需要高性能计算的任务时。"CountDownLatch" 和 "Thread" 是Java编程语言中实现多线程并行执行的关键工具,它们有助于提高程序的运行效率...
本项目涉及的关键技术是“多线程文件分割与合并”,这在处理大量数据和大文件时非常实用。下面将详细介绍这些概念及其在C#中的实现。 首先,我们来看“文件分割”。文件分割是指将一个大文件分成多个小文件,以便于...
多线程下载m3u8格式的视频能显著提高下载速度,特别是在网络条件不稳定或者视频文件较大的情况下。 本实例主要分为以下几个步骤: 1. **预下载**:首先,我们需要获取m3u8文件。这通常通过发送HTTP请求到m3u8链接...
本文将深入探讨Visual Basic(VB6)如何实现四线程合并同步下载程序,以及它在多线程下载中的应用。 首先,我们要理解什么是多线程。线程是操作系统分配CPU时间的基本单元,一个进程可以包含一个或多个线程。在单...
本项目“poi多线程大数据导出excel文件”提供了一个解决方案,利用多线程来提高Excel的大数据导出效率。 Apache POI 3.1版本是较早的版本,而项目中使用了更新的4.1版本,这意味着它可能利用了更多优化和新特性。在...
NULL 博文链接:https://wentise.iteye.com/blog/1472493
这是一个基于Visual Basic开发的四线程合并同步下载程序的源码资源。Visual Basic是一种由Microsoft开发的面向对象的编程环境,常用于创建Windows应用程序。在这个项目中,开发者利用多线程技术来提高文件下载的效率...
在IT行业中,多线程是一种常见的编程技术,尤其在C#这样的高级编程语言中,它被广泛用于提高程序的执行效率和并发性。本示例“C#多线程排序例子”聚焦于如何利用多线程来提升排序操作的速度。 首先,让我们了解什么...
Java多线程导出Excel是处理大数据量时的一种高效策略,尤其在面对千万级别的数据时。传统的Apache POI库在处理大规模数据时可能会遇到栈溢出(StackOverflowError)和内存溢出(OutOfMemoryError)等问题,因为这些...
在C# Winform应用中实现多线程下载是一项常见的任务,尤其在处理大文件或需要提高下载速度的情况下。本文将详细讲解如何利用C#的多线程技术来创建一个Winform应用程序,实现高效的文件下载功能。 首先,我们需要...
在这个“多线程多任务下载软件.zip”压缩包中,包含的是一个易语言项目的源码,可以作为学习和参考的实例。下面将详细解释多线程和多任务下载的概念,以及如何在易语言中实现这些功能。 1. **多线程技术**:在...
** yolov5目标检测多线程C++部署详解** 在计算机视觉领域,目标检测是一项关键技术,用于识别图像或视频帧中的特定对象。YOLO(You Only Look Once)是一种高效的目标检测算法,以其实时性能和相对较高的准确性而...
线程池管理和多线程上传是并发编程中的一个重要实践,特别是在大数据传输和网络服务中。在Java等编程语言中,线程池通过有效地管理和复用线程资源,避免了频繁创建和销毁线程带来的开销,提升了系统性能。下面将详细...