最近要割接个项目,要把另外一个公司的数据库里的一张表倒到我们库里,数据有一亿三千多万吧。正号也符合生产者和消费者的状况。以前用过点线程池和同步队列,,写个例子,让大家拍砖。不多说了,直接上代码,
1. 线程池
public class ThreadPool {
private ExecutorService exe = null;// 线程池
private int pool_size;
private
Service
service ;
public ThreadPool(int pool_size,
Service service {
this.pool_size = pool_size;
this.
service =
service ;
exe = Executors.newFixedThreadPool(pool_size);// 创建线程池
System.out.println("the server is ready");
}
/**
*
* 运行循环实例线程,根据要实例的线程个数,传入条件ID
*
* @param worknum
*/
public void server() {
int i = 0;
while (i < pool_size) {
// 实例指定个线程
InsertData t = new InsertData(
service );
exe.execute(t);// 放入线程池
i++;
}
}
}
2.线程
public class InsertData extends Thread {
private Service service ;
public InsertData(
Service service ){
this.
service =
service ;
}
@Override
public void run() {
SyncDataQueue syncDataQueue=SyncDataQueue.getInstance();
while (true) {
List<
Mode > list=new ArrayList<Mode>();
//移除队列里的所有实体,并批量添加
syncDataQueue.getBlockingQueue().drainTo(list);
if (list!=null) {
service.batchSvae(list);
}
}
}
}
3.实现同步队列
public class SyncDataQueue {
private static SyncDataQueue instance = null;
private BlockingQueue<
Mode > blockingQueue = null;
public SyncDataQueue() {
//队列容量
blockingQueue = new ArrayBlockingQueue<
Mode >(40000);
}
public static SyncDataQueue getInstance() {
if (instance == null) {
instance = new SyncDataQueue();
}
return instance;
}
public BlockingQueue<
Mode > getBlockingQueue() {
return blockingQueue;
}
}
4.导入文件,并启动线程池
public class FileThread extends Thread {
private String path;
public FileThread(String path) {
this.path = path;
}
@Override
public void run() {
if (StringUtils.isNotBlank(path)) {
try {
getSmsListByFileThread(new File(path));
} catch (FileNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
public void getSmsListByFileThread(File file)
throws FileNotFoundException, IOException, InterruptedException {
//初始化同步队列
SyncDataQueue syncDataQueue = SyncDataQueue.getInstance();
BlockingQueue<
Mode > blockingQueue = syncDataQueue.getBlockingQueue();
// 缓冲大小为10M
final int BUFFER_SIZE = 10 * 1024 * 1024;
BufferedInputStream fis = new BufferedInputStream(new FileInputStream(file));
// 用10M的缓冲读取文本文件
BufferedReader reader = new BufferedReader(new InputStreamReader(fis,"utf-8"), BUFFER_SIZE);
String line = "";
int i=0;
while ((line = reader.readLine()) != null) {
String[] data = line.split(",");
Mode mode=new Mode();
//填充实体
//放进队列 让 线程去抢队列的里实体
blockingQueue.put(mode);
}
}
public String getPath() {
return path;
}
public void setPath(String path) {
this.path = path;
}
/**
* 不加索引每分钟百万上下, 加了索引有点惨不忍睹。
*/
public static void main(String[] args) {
Service service=(Service)Syscontext.getBean("
service ");
//初始化线程池,并启动
ThreadPool threadPool = new ThreadPool(30,smsHouseSmsService);
threadPool.server();
//每个文件都是1G的
new FileThread("C:/Users/bjz/Desktop/mcexport/Msg_20120322104001_1_1.txt").start();
........
new FileThread("C:/Users/bjz/Desktop/mcexport/Msg_20120322104001_1_15.txt").start();
}
}
分享到:
相关推荐
在计算机科学中,多线程和循环队列是两个重要的概念,它们在高效并发编程中发挥着关键作用。本文将详细探讨多线程环境下的循环队列应用。 首先,我们来理解多线程。多线程是一种编程模型,允许一个程序同时执行多个...
队列在多线程环境下常常用于任务调度、消息传递等场景,因为它们能有效地管理和同步数据访问。本实例将详细讲解如何在多线程中使用C#的Queue类。 首先,我们创建一个队列实例,通过`new Queue()`来指定存储的数据...
这种模式利用了多线程技术,通过队列作为数据结构来协调生产者(日志生成者)和消费者(日志处理器)之间的交互,确保数据的安全性和一致性。 1. **多线程**:多线程是现代计算机系统中并发执行任务的基本方式。在...
在IT行业中,多线程和队列是两个关键的概念,特别是在并发编程和高效系统设计中。本篇文章将深入探讨这两个概念及其结合应用。 首先,让我们理解“多线程”。多线程是计算机程序设计中的一个技术,允许一个应用程序...
综上所述,这个项目涉及了C#多线程编程的核心概念和技术,包括工作队列的实现、线程池的使用、异步编程以及线程安全的编程实践。通过深入理解这些知识点,开发者可以构建高效、可扩展且健壮的多线程应用程序。
总之,支持多线程和泛型的阻塞队列是一种强大的工具,它能帮助开发者构建高效、稳定的并发程序,简化多线程环境下的同步问题,并允许存储不同类型的数据。在理解和使用时,需要理解其内部原理,合理选择队列容量,...
在编程领域,尤其是在性能敏感的系统中,多线程任务队列是一种常见且重要的设计模式。这个主题主要涉及C++编程语言,它利用了C++的特性来...在C++中实现这样的队列,需要掌握线程同步、线程池和合适的数据结构等知识。
在IT行业中,多线程和队列是两个重要的概念,它们在系统设计和优化中扮演着关键角色。这里我们讨论的"多线程...同时,它也提供了测试和调试多线程同步问题的机会,这对于提升编程技能和解决复杂系统问题非常有价值。
在《秒杀多线程系列》的前十五篇中介绍多线程的相关概念,多线程同步互斥问题《秒杀多线程第四篇一个经典的多线程同步问题》及解决多线程同步互斥的常用方法——关键段、事件、互斥量、信号量、读写锁。为了让大家...
标题与描述均提到了“多线程同步大量数据转录”的概念,这涉及到在计算机科学领域中的并发编程技术,特别是如何有效地处理大规模数据集的转录工作。在现代软件开发中,多线程同步机制是优化性能、提高系统吞吐量的...
源代码的分析可以帮助我们更好地理解如何在MFC环境中实现多线程队列,以及如何有效地管理和同步线程。通过这个示例,开发者可以学习到如何在实际项目中利用多线程技术优化程序性能,同时保证程序的稳定性和安全性。
理解多线程队列和线程池的原理对于优化并发应用程序至关重要。通过C语言实现,你可以更深入地了解底层操作系统是如何调度和管理线程的,这对于提升软件性能和可扩展性有着重要意义。同时,掌握这些技术也为你在处理...
在Python中,多线程同步机制是通过锁、条件同步和队列来保证数据一致性。使用锁时,线程会竞争获取锁并释放锁,防止并发访问共享资源。条件同步允许线程在满足特定条件后继续执行,而队列则提供了一种线程间安全传递...
总的来说,理解和掌握VC++中的多线程同步和异步是提升程序性能和稳定性的重要手段。开发者需要深入理解各种线程同步机制,合理运用异步操作,确保代码的正确性和可维护性。在实际项目中,应根据需求选择合适的线程...
在Linux操作系统中,多进程和多线程是两种并发执行的方式,它们在处理并发问题时,经常需要进行同步和互斥操作,以确保数据的一致性和程序的正确性。本篇将详细介绍这两种并发模型以及如何在Linux环境中实现同步互斥...
实现消息队列的关键因素是考量不同线程访问消息队列的同步问题。本实现涉及到几个知识点 std::lock_guard 介绍 std::lock_gurad 是 C++11 中定义的模板类。定义如下: template <class> class lock_guard; lock_...
在Android应用开发中,多线程和队列下载是一种常见的技术,用于提高应用程序的性能和用户体验,尤其是在处理大文件下载任务时。这个“多线程和队列下载”项目可能是针对一个商业模式的解决方案,旨在优化资源利用,...
在C++编程中,多线程安全的消息队列(Message Queue)是一种常用的数据结构,用于在并发环境中同步和通信。消息队列允许不同线程之间的异步操作,从而提高程序的执行效率。本文将深入探讨如何创建一个多线程安全的...
综上所述,"SemQueue"是一个实现了多线程和缓存队列功能的组件,它利用信号量实现线程同步,采用FIFO策略进行数据管理,并且具备跨平台的特性,能够在Windows和Linux环境下运行。理解和掌握这样的组件对于提升多线程...
### 多线程并发访问无锁队列的算法研究 #### 1. 引言 随着多核技术的快速发展,并行数据结构技术成为了研究领域的热点话题。传统的有锁并发访问方式不仅带来了额外的开销,而且有可能导致死锁等问题的发生。因此,...