java多线程查询

由于最近工作遇到性能问题,尝试研究用多线程来实现,结果速度快了好几倍

下面是多线程查询的部分代码,提供给大家参考下:

线程类:

带返回值的类要实现Callable接口,具体业务逻辑没有实现,只是写了个空方法在里面

package com.sanfy.demo.thread;

import java.util.List;

import java.util.Map;

import java.util.concurrent.Callable;

import com.sanfy.demo.model.WorkLoad;

public class QueryThread implements Callable<List<WorkLoad>> {

private List<WorkLoad> workLoads;

private WorkLoadService workLoadService;

private Map<String, Object> parameters;

private List<String> dates;

private int begin;

private int end;

public QueryThread(Map<String, Object> parameters,List<String> dates, int begin, int end,WorkLoadService workLoadService) {

super();

this.parameters = parameters;

this.dates = dates;

this.begin = begin;

this.end = end;

this.workLoadService=workLoadService;

}

/**

* @return Map<Integer, EchartsTenInDatasDTO>

* @see java.lang.Callable#call()

*/

@Override

public Map<Integer, WorkLoad> call() {

for (int i = begin; i < end; i++) {

queryListByMap(dates.get(i));

}

return workLoads;

}

/**

* 查询方法

*

* @param date 日期

* @param i i

*/

private void queryListByMap(String date) {

//具体的查询

workLoads=workLoadService.queryList(parameters,date);

}

public List<WorkLoad> getWorkLoads() {

return workLoads;

}

public void setWorkLoads(List<WorkLoad> workLoads) {

this.workLoads = workLoads;

}

public WorkLoadService getWorkLoadService() {

return workLoadService;

}

public void setWorkLoadService(WorkLoadService workLoadService) {

this.workLoadService = workLoadService;

}

public Map<String, Object> getParameters() {

return parameters;

}

public void setParameters(Map<String, Object> parameters) {

this.parameters = parameters;

}

public List<String> getDates() {

return dates;

}

public void setDates(List<String> dates) {

this.dates = dates;

}

public int getBegin() {

return begin;

}

public void setBegin(int begin) {

this.begin = begin;

}

public int getEnd() {

return end;

}

public void setEnd(int end) {

this.end = end;

}

}

serive调用线程类来实现多线程查询:

package com.sanfy.demo.thread;

import java.util.ArrayList;

import java.util.List;

import java.util.Map;

import java.util.concurrent.Callable;

import java.util.concurrent.ExecutorService;

import java.util.concurrent.Executors;

import java.util.concurrent.Future;

import com.sanfy.demo.model.WorkLoad;

public class QuerySerivce {

private WorkLoadService workLoadService;

public List<WorkLoad> queryListsByMap(String sqlCode, Map<String, Object> parameters) throws Exception {

List<WorkLoad> workLoads=new ArrayList<WorkLoad>();

long startTime = System.currentTimeMillis();

List<String> dates = DateUtil.getCurrentInYear(parameters.get("startDate").toString(), 12);

if (dates != null && dates.size() > 0) {

int len = dates.size();

// 创建线程的个数

int count = len % 2 == 0 ? len / 2: (len / 2) + 1;

// 创建线程池数量

ExecutorService pool = Executors.newFixedThreadPool(count);

List<Callable<List<WorkLoad>>> tasks = new ArrayList<Callable<List<WorkLoad>>>();

for (int i = 0; i < count; i++) {

// 每个线程负责插入数据的开始位置

int start = i * 2;

// 每个线程负责插入数据的结束位置

int end = i == count - 1 ? i * 2 + (len - i * 2) : i* 2+ 2;

Map<String, Object> parametersClone = new HashMap<String, Object>();

parametersClone.putAll(parameters);

// 线程返回值

Callable<List<WorkLoad>> task = new QueryThread(parametersClone, sqlCode, dates, start, end,workLoadService);

tasks.add(task);

}

// 执行线程

List<Future<List<WorkLoad>>> futures = pool.invokeAll(tasks);

// 处理线程返回结果

if (futures != null && futures.size() > 0) {

for (Future<List<WorkLoad>> future : futures) {

workLoads.addAll(future.get());

}

}

// 关闭线程池

pool.shutdown();

}

long endTime = System.currentTimeMillis();

logger.info("多个情况报表查询总共花了:" + (endTime - startTime) / 1000 + "秒时间!");

return workLoads;

}

}

后续会补上多线程批量保存与android多线程支持断点续传下载的内容

由于是实际项目,所以把具体的内容删除了,直接修改的,供大家参考下

时间: 2024-10-09 06:38:36

java多线程查询的相关文章

Java多线程系列--“JUC锁”11之 Semaphore信号量的原理和示例

概要 本章,我们对JUC包中的信号量Semaphore进行学习.内容包括:Semaphore简介Semaphore数据结构Semaphore源码分析(基于JDK1.7.0_40)Semaphore示例 转载请注明出处:http://www.cnblogs.com/skywang12345/p/3534050.html Semaphore简介 Semaphore是一个计数信号量,它的本质是一个"共享锁". 信号量维护了一个信号量许可集.线程可以通过调用acquire()来获取信号量的许可

从JAVA多线程理解到集群分布式和网络设计的浅析

对于JAVA多线程的应用非常广泛,现在的系统没有多线程几乎什么也做不了,很多时候我们在何种场合如何应用多线程成为一种首先需要选择的问题,另外关于java多线程的知识也是非常的多,本文中先介绍和说明一些常用的,在后续文章中如果有必要再说明更加复杂的吧,本文主要说明多线程的一下几个内容: 1.在应用开发中什么时候选择多线程? 2.多线程应该注意些什么? 3.状态转换控制,如何解决死锁? 4.如何设计一个具有可扩展性的多线程处理器? 5.多线程联想:在多主机下的扩展-集群? 6.WEB应用的多线程以及

Rhythmk 一步一步学 JAVA (21) JAVA 多线程

1.JAVA多线程简单示例 1.1 .Thread  集成接口 Runnable 1.2 .线程状态,可以通过  Thread.getState()获取线程状态: New (新创建) Runnable (可以运行) Blocked  (被阻塞) Waiting  (等待) Timed waiting (计时等待) Terminated  (被终止) ? 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27

Java多线程系列--“JUC锁”02之 互斥锁ReentrantLock

ReentrantLock介绍 ReentrantLock是一个可重入的互斥锁,又被称为"独占锁". 顾名思义,ReentrantLock锁在同一个时间点只能被一个线程锁持有:而可重入的意思是,ReentrantLock锁,可以被单个线程多次获取.ReentrantLock分为"公平锁"和"非公平锁".它们的区别体现在获取锁的机制上是否公平."锁"是为了保护竞争资源,防止多个线程同时操作线程而出错,ReentrantLock在

JAVA多线程和并发基础面试问答(转载)

原文链接:http://www.cnblogs.com/dolphin0520/p/3932934.html 多线程和并发问题是Java技术面试中面试官比较喜欢问的问题之一.在这里,从面试的角度列出了大部分重要的问题,但是你仍然应该牢固的掌握Java多线程基础知识来对应日后碰到的问题. Java多线程面试问题 1. 进程和线程之间有什么不同? 一个进程是一个独立(self contained)的运行环境,它可以被看作一个程序或者一个应用.而线程是在进程中执行的一个任务.Java运行环境是一个包含

JAVA多线程和并发基础面试问答

原文链接:http://ifeve.com/java-multi-threading-concurrency-interview-questions-with-answers/ 多线程和并发问题是Java技术面试中面试官比较喜欢问的问题之一.在这里,从面试的角度列出了大部分重要的问题,但是你仍然应该牢固的掌握Java多线程基础知识来对应日后碰到的问题.(校对注:非常赞同这个观点) Java多线程面试问题 1. 进程和线程之间有什么不同? 一个进程是一个独立(self contained)的运行环

JAVA多线程面试题

1.Thread 类中的start() 和 run() 方法有什么区别? Thread.start()方法(native)启动线程,使之进入就绪状态,当cpu分配时间该线程时,由JVM调度执行run()方法. 当你调用start()方法时你将创建新的线程,并且执行在run()方法里的代码.但是如果你直接调用run()方法,它不会创建新的线程也不会执行调用线程的代码. 2.Java中Runnable和Callable有什么不同? Runnable和Callable都代表那些要在不同的线程中执行的任

JAVA多线程和并发基础面试问答【转】

JAVA多线程和并发基础面试问答 多线程和并发问题是Java技术面试中面试官比较喜欢问的问题之一.在这里,从面试的角度列出了大部分重要的问题,但是你仍然应该牢固的掌握Java多线程基础知识来对应日后碰到的问题.(校对注:非常赞同这个观点) Java多线程面试问题 1. 进程和线程之间有什么不同? 一个进程是一个独立(self contained)的运行环境,它可以被看作一个程序或者一个应用.而线程是在进程中执行的一个任务.Java运行环境是一个包含了不同的类和程序的单 一进程.线程可以被称为轻量

Java多线程(五) Lock接口,ReentranctLock,ReentrantReadWriteLock

在JDK5里面,提供了一个Lock接口.该接口通过底层框架的形式为设计更面向对象.可更加细粒度控制线程代码.更灵活控制线程通信提供了基础.实现Lock接口且使用得比较多的是可重入锁(ReentrantLock)以及读写锁(ReentrantReadWriteLock). 1. ReentrantLock 在Java多线程(二) 多线程的锁机制 里面,已经总结过通过使用Synchronized关键字实现线程内的方法锁定.但使用Synchronized关键字有一些局限性,上锁和释放锁是由JVM决定的