`
Tristan_S
  • 浏览: 378701 次
  • 性别: 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或其他支持多线程的编程语言中,如何有效地分配工作到多个线程,...

    高并发多线程处理demo-java.rar

    6. **阻塞队列(BlockingQueue)**:在多线程处理中,可能会使用阻塞队列,如`LinkedBlockingQueue`,它允许生产者线程添加任务,而消费者线程在队列为空时会被阻塞,直到有新的任务到来。这样可以确保任务被及时...

    多线程基础与基于多线程的简单聊天室

    服务器端使用多线程处理来自不同客户端的连接请求,客户端则通过连接服务器进行通信。通过多线程,服务器可以同时处理多个并发连接,提升系统的并行处理能力。 10. **多线程的调试**:在开发过程中,利用Java的...

    java多线程加队列上传文件_后台处理

    ### Java多线程加队列上传文件_后台处理 #### 概述 本文将详细介绍一个基于Java实现的多线程文件上传系统,并结合队列管理技术来优化后台处理流程。该系统通过创建多个线程来并行处理客户端的文件上传请求,同时...

    线程----BlockingQueue

    `BlockingQueue`是一种特殊类型的队列,主要用于多线程环境中的任务管理。它具有以下特性:当队列为空时,从队列中获取元素的操作会被阻塞;同样地,当队列满时,向队列中添加元素的操作也会被阻塞。这种特性使得`...

    基于任务线程处理例子

    在Java编程中,任务线程处理是一种常见的并发编程模型,它允许我们利用多核处理器的优势,提高程序的执行效率。本示例将深入探讨如何在Java中实现基于任务的线程处理,包括线程的基本概念、任务调度以及队列的应用。...

    java 多线程编程实战指南(核心 + 设计模式 完整版)

    《Java多线程编程实战指南》这本书深入浅出地讲解了Java多线程的核心概念和实战技巧,分为核心篇和设计模式篇,旨在帮助开发者掌握并应用多线程技术。 1. **线程基础** - **线程的创建**:Java提供了两种创建线程...

    多线程并发处理数据的问题

    在IT行业中,多线程并发处理数据是一种常见的优化策略,特别是在大数据处理、网络服务和分布式系统中。通过并发,可以充分利用多核处理器的计算能力,提高程序执行效率,缩短任务的总体完成时间。本篇文章将深入探讨...

    生产者-消费者多线程处理

    总之,"生产者-消费者"多线程处理是一个核心的并发编程概念,它展示了如何在多线程环境中有效地管理和共享资源,以实现高效的程序执行。理解并正确实现这一模式对于任何从事并发编程或系统设计的IT专业人员来说都至...

    java实现多线程文件传输

    多线程允许我们同时处理多个任务,这对于大文件传输或需要并行处理的场景尤其有用。本篇文章将深入探讨如何使用Java实现多线程文件传输,并涵盖以下几个关键知识点: 1. **线程基础**:在Java中,线程是程序执行的...

    多线程面试题

    在Java编程领域,多线程是面试中常见且重要的知识点,尤其对于系统设计和高并发处理的岗位至关重要。本文将围绕“多线程面试题”这一主题,深入探讨相关概念、技术及其应用。 1. **线程的概念**:线程是程序执行的...

    BlockingQueue队列自定义超时时间取消线程池任务

    它接收的任务会被放入工作队列,等待线程处理。通过设定线程池大小,可以限制并发执行的任务数量,避免资源过度消耗。 `FutureTask`是线程池处理任务的一种方式,它不仅包含了一个`Runnable`或`Callable`任务,还...

    java多线程处理教学案例

    在Java编程语言中,多线程是并发编程的重要组成部分,它允许程序同时执行多个任务,提升系统的效率和响应性。本教学案例将深入探讨如何在Java中实现多线程,并通过一个具体的生产者消费者模式来进一步阐述其核心概念...

    java多线程详解(比较详细的阐述了多线程机制)

    在多线程环境中,异常处理也需特别注意,合理的try-catch-finally结构可以保证即使在多线程环境中也能正确处理异常。 总之,Java多线程是构建高性能并发应用的基础,理解并掌握线程的创建、同步、通信、协作模式...

    多线程,高并发.zip

    在Java中,线程是轻量级的,因为它共享进程的内存空间,这使得多线程成为处理大量并发任务的有效方式。创建Java线程有两种主要方法:通过实现`Runnable`接口或继承`Thread`类。`Runnable`通常更灵活,因为它允许线程...

    多线程终极案例程序(多线程进阶)

    在IT行业中,多线程是Java编程中一个重要的高级特性,尤其对于开发高效能和响应迅速的应用至关重要。这个“多线程终极案例程序”旨在帮助Java开发者深化对多线程的理解,通过一个具体的“多兵种联合攻击防御塔”游戏...

    java 多线程并发实例

    在Java编程中,多线程并发是提升程序执行效率、充分利用多核处理器资源的重要手段。本文将基于"java 多线程并发实例"这个主题,深入探讨Java中的多线程并发概念及其应用。 首先,我们要了解Java中的线程。线程是...

    Java多线程工具篇BlockingQueue的详解

    Java多线程工具篇BlockingQueue的详解 BlockingQueue是Java多线程工具篇中的一种高效安全的队列类,在多线程环境中扮演着关键角色。它能够高效解决多线程中数据传输的问题,使得数据由队列的一端输入,从另外一端...

    关于多线程的专用书籍是真的

    多线程是计算机编程中一个重要的概念,尤其是在并发处理和优化性能时,它的应用非常广泛。下面将详细介绍多线程相关知识及其在实际编程中的应用。 **多线程概念** 多线程是指在一个程序中同时执行多个不同的线程。...

    java多线程经典案例

    Java多线程是Java编程中的重要概念,它允许程序同时执行多个任务,极大地提升了程序的效率和性能。在Java中,实现多线程有两种主要方式:通过实现Runnable接口或者继承Thread类。本案例将深入探讨Java多线程中的关键...

Global site tag (gtag.js) - Google Analytics