`
Tristan_S
  • 浏览: 361197 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

BlockingQueue 多线程处理

 
阅读更多
更新表1000行 中的状态, 每次update 需要一秒的时间 模拟真实的业务逻辑。
怎么能最快的更新完表中所有的数据

SingleUpate 每次查询后更新
MultipleUpdate 用BlockingQueue 的方式实现多线程更新

SingleUpate
package com.tristan.bigdata;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;

public class SingleUpate {
	
	public static void main(String[] args) throws Exception {
		Class.forName("oracle.jdbc.driver.OracleDriver");
		Connection con = DriverManager.getConnection(
				"jdbc:oracle:thin:@localhost:1521:XE", "tristan", "654321");

		 PreparedStatement stmt = con.prepareStatement("update t_bigtable set status=? where id =?");  
	
	        
		PreparedStatement pStmt = con.prepareStatement("select * from t_bigtable order by id");
		ResultSet result = pStmt.executeQuery();
		while (result.next()) {
			int id = result.getInt(1);
			System.out.println(id);
			updateStatus(id, stmt, 2);
		}
		
		con.close();
	}

	private static void updateStatus(int id, PreparedStatement stmt, int status) throws SQLException, InterruptedException {

		Thread.sleep(1000);
		stmt.setInt(1, status);
	     stmt.setInt(2, id);
	     
		 stmt.executeUpdate();  
	}
}



MultipleUpdate
package com.tristan.bigdata;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.util.concurrent.ArrayBlockingQueue;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;

public class MultipleUpdate {

	private static int maxStoreSize = 1000;
	public static ArrayBlockingQueue<Integer> queue = new ArrayBlockingQueue<Integer>(
			maxStoreSize);

	public static void main(String[] args) throws Exception {
		Class.forName("oracle.jdbc.driver.OracleDriver");
		Connection con = DriverManager.getConnection(
				"jdbc:oracle:thin:@localhost:1521:XE", "tristan", "654321");

		PreparedStatement stmt = con
				.prepareStatement("update t_bigtable set status=? where id =?");

		PreparedStatement pStmt = con
				.prepareStatement("select * from t_bigtable order by id");
		ResultSet result = pStmt.executeQuery();
		while (result.next()) {
			int id = result.getInt(1);
			System.out.println(id);

			queue.put(id);
		}

		ExecutorService es = Executors.newCachedThreadPool();
		Worker w = new Worker(stmt,3);
		
		es.submit(w);
		es.submit(w);
		es.submit(w);
		es.submit(w);
		es.submit(w);
		es.submit(w);
		es.submit(w);
		es.submit(w);
		es.submit(w);
		es.submit(w);
		
		Thread.sleep(Long.MAX_VALUE);
		// con.close();
	}

}

class Worker implements Runnable {
	PreparedStatement stmt;
	int status;
	
	public Worker(PreparedStatement stmt, int status) {
		this.stmt = stmt;
		this.status = status;
	}

	@Override
	public void run() {
		while(true){
			try {
				int id = (Integer)MultipleUpdate.queue.take();
				System.out.println(Thread.currentThread().getName() + " : "+id);
				
				Thread.sleep(1000);
				stmt.setInt(1, status);
				stmt.setInt(2, id);
				stmt.executeUpdate();
			
			} catch (Exception e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
		}
		

	}

}




SQL
select * from t_bigtable order by id;
truncate table t_bigtable;

declare
i number;
begin
i:=0;
for i in 1..1000 loop
  insert into t_bigtable values(i,1);
end loop;
end;
分享到:
评论

相关推荐

    个人总结的深入java多线程开发

    看完《think in java》多线程章节,自己写的多线程文档,还结合了其他的相关网络资料。 线程 一. 线程池 1)为什么要使用线程池 2 2)一个具有线程池的工作队列 3 3)使用线程池的风险: 4 4)有效使用线程池的原则 5...

    第7章-JUC多线程v1.1.pdf

    ThreadPoolExecutor.CallerRunsPolicy:由调用线程处理该任务 Executor接口有一个子接口ExecutorService, ExecutorService的实现类AbstracExecutorService, 而ThreadPoolExecutor正是AbstracExecutorService的...

    一个开源的Java基础工具包

    数据库工具类,提供了关闭方法:关闭可以传入多个参数,关闭的顺序是按照参数的顺序来的,用于一次性关闭Connnection、Statement、ResultSet等 newSqlRunner方法用于快速新建一个SqlRunner(此类介绍参考下问) 3、...

    java线程池概念.txt

     ThreadPoolExecutor.CallerRunsPolicy:由调用线程处理该任务 3:对线程池的基本使用及其部分源码的分析(注意:这里的源码分析是基于jdk1.6;) a:线程池的状态 volatile int runState; static final int ...

    Java并发编程(学习笔记).xmind

    (1)如果设计正确,多线程程序可以通过提高处理器资源的利用率来提升系统吞吐率 (2)建模简单:通过使用线程可以讲复杂并且异步的工作流进一步分解成一组简单并且同步的工作流,每个工作流在一个单独的线程...

    es_data_export:ES数据导出工具,ES data export tool,elasticsearch data export tool,elasticsearch数据导出到文件,elasticsearch数据导出到数据库,目前已支持全部的6.x的版本,后续跟进更低的版本

    该工具实现从ES中导出数据,并且可以对导出的数据格式和数据文件做部分自定义,该工具主要使用ES中srcoll接口多线程导出数据. Design 项目采用 Java 构建。 访问ES部分采用官方 RestClient 构建通信。 数据导出方式为...

    DC_Tower_Elevator:直流塔式电梯挑战赛

    DC_Tower_Elevator实施方式...要求处理每个电梯都会分配一个或多个请求。 它检查队列中是否有更多的请求到达同一方向,并且至少在临时位置或更高位置。 这样就完成了,每个电梯可以同时携带多个Passangers和多个请求。

    Java并发编程实战

    1.2.1 发挥多处理器的强大能力 1.2.2 建模的简单性 1.2.3 异步事件的简化处理 1.2.4 响应更灵敏的用户界面 1.3 线程带来的风险 1.3.1 安全性问题 1.3.2 活跃性问题 1.3.3 性能问题 1.4 线程无处不在 第一...

    Java 并发编程实战

    1.2.1 发挥多处理器的强大能力 1.2.2 建模的简单性 1.2.3 异步事件的简化处理 1.2.4 响应更灵敏的用户界面 1.3 线程带来的风险 1.3.1 安全性问题 1.3.2 活跃性问题 1.3.3 性能问题 1.4 线程无处不在 第一...

    java内核源码-JavaCompass:「Java指南针」为你学习Java指明方向。内容涵盖互联网Java工程师所需要掌握的核心知识,涉及J

    多线程与并发 Spring SpringMVC SpringBoot Mybatis 数据结构与算法 入门基础 基础数据结构 数组&链表 数组&链表进阶 栈 队列 算法思想 数论&枚举&递归&分治&回溯 排序及其源码实现 贪心&动态规划 高级数据结构 树论...

    java面试常见基础(深层次,高级研发)

    12.1. 多线程原子操作的安全性 31 13. Cas怎么实现unsafe? 32 13.1. Unsafe 32 13.2. CAS 32 13.3. 由CAS分析AtomicInteger原理 33 13.4. CAS的缺点 35 14. Map数据结构? 35 14.1. 一、定义 36 14.2. 二、构造函数...

    Java JDK实例宝典

    7 一个支持多线程的服务器框架 13. 8 代理服务器 13. 9 Telnet客户端 13. 10 UDP编程 13. 11 聊天室服务器端 13. 12 聊天室客户端 13. 13 FTP客户端 第14章 数据库 14. 1 连接各种...

    javaSE代码实例

    第16章 多线程——Java中的并发协作 343 16.1 线程的基本知识 343 16.1.1 多线程编程的意义 343 16.1.2 定义自己的线程 344 16.1.3 创建线程对象 345 16.1.4 启动线程 347 16.1.5 同时使用多个线程 ...

Global site tag (gtag.js) - Google Analytics