`
jiangzhoubai
  • 浏览: 58672 次
  • 性别: Icon_minigender_1
  • 来自: 太原
社区版块
存档分类
最新评论

多线程和同步队列

阅读更多

最近要割接个项目,要把另外一个公司的数据库里的一张表倒到我们库里,数据有一亿三千多万吧。正号也符合生产者和消费者的状况。以前用过点线程池和同步队列,,写个例子,让大家拍砖。不多说了,直接上代码,

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();
}
}

 

0
0
分享到:
评论
5 楼 gamehiboy 2012-04-10  
求Service类的代码,
4 楼 jiangzhoubai 2012-04-09  
gamehiboy 写道
Service类是啥,

插入数据的service
3 楼 gamehiboy 2012-04-09  
Service类是啥,
2 楼 jiangzhoubai 2012-03-30  
netkiller.github.com 写道
:-) 我也刚刚做过类似的东西,我是造数据,python 实现比java 省事

就是开几个进程,在哪里守候,每个进程可以开启N个线程。

剩下就是往Queue里面赛东西,那些守护进程从queue里面拿任务。。

有兴趣看看
http://netkiller-github-com.iteye.com/blog/1453700


好的
1 楼 netkiller.github.com 2012-03-30  
:-) 我也刚刚做过类似的东西,我是造数据,python 实现比java 省事

就是开几个进程,在哪里守候,每个进程可以开启N个线程。

剩下就是往Queue里面赛东西,那些守护进程从queue里面拿任务。。

有兴趣看看
http://netkiller-github-com.iteye.com/blog/1453700

相关推荐

    多线程与循环队列

    在计算机科学中,多线程和循环队列是两个重要的概念,它们在高效并发编程中发挥着关键作用。本文将详细探讨多线程环境下的循环队列应用。 首先,我们来理解多线程。多线程是一种编程模型,允许一个程序同时执行多个...

    C#队列Queue多线程用法实例

    队列在多线程环境下常常用于任务调度、消息传递等场景,因为它们能有效地管理和同步数据访问。本实例将详细讲解如何在多线程中使用C#的Queue类。 首先,我们创建一个队列实例,通过`new Queue()`来指定存储的数据...

    多线程操作日志队列

    这种模式利用了多线程技术,通过队列作为数据结构来协调生产者(日志生成者)和消费者(日志处理器)之间的交互,确保数据的安全性和一致性。 1. **多线程**:多线程是现代计算机系统中并发执行任务的基本方式。在...

    多线程 队列利用

    在IT行业中,多线程和队列是两个关键的概念,特别是在并发编程和高效系统设计中。本篇文章将深入探讨这两个概念及其结合应用。 首先,让我们理解“多线程”。多线程是计算机程序设计中的一个技术,允许一个应用程序...

    workquere工作队列 多线程

    综上所述,这个项目涉及了C#多线程编程的核心概念和技术,包括工作队列的实现、线程池的使用、异步编程以及线程安全的编程实践。通过深入理解这些知识点,开发者可以构建高效、可扩展且健壮的多线程应用程序。

    支持多线程和泛型的阻塞队列

    总之,支持多线程和泛型的阻塞队列是一种强大的工具,它能帮助开发者构建高效、稳定的并发程序,简化多线程环境下的同步问题,并允许存储不同类型的数据。在理解和使用时,需要理解其内部原理,合理选择队列容量,...

    多线程任务队列

    在编程领域,尤其是在性能敏感的系统中,多线程任务队列是一种常见且重要的设计模式。这个主题主要涉及C++编程语言,它利用了C++的特性来...在C++中实现这样的队列,需要掌握线程同步、线程池和合适的数据结构等知识。

    多线程队列源代码

    在IT行业中,多线程和队列是两个重要的概念,它们在系统设计和优化中扮演着关键角色。这里我们讨论的"多线程...同时,它也提供了测试和调试多线程同步问题的机会,这对于提升编程技能和解决复杂系统问题非常有价值。

    秒杀多线程第十六篇 多线程十大经典案例之一 双线程读写队列数据

    在《秒杀多线程系列》的前十五篇中介绍多线程的相关概念,多线程同步互斥问题《秒杀多线程第四篇一个经典的多线程同步问题》及解决多线程同步互斥的常用方法——关键段、事件、互斥量、信号量、读写锁。为了让大家...

    多线程同步大量数据转录的多线程和同步

    标题与描述均提到了“多线程同步大量数据转录”的概念,这涉及到在计算机科学领域中的并发编程技术,特别是如何有效地处理大规模数据集的转录工作。在现代软件开发中,多线程同步机制是优化性能、提高系统吞吐量的...

    MFC的多线程队列程序源代码

    源代码的分析可以帮助我们更好地理解如何在MFC环境中实现多线程队列,以及如何有效地管理和同步线程。通过这个示例,开发者可以学习到如何在实际项目中利用多线程技术优化程序性能,同时保证程序的稳定性和安全性。

    多线程队列

    理解多线程队列和线程池的原理对于优化并发应用程序至关重要。通过C语言实现,你可以更深入地了解底层操作系统是如何调度和管理线程的,这对于提升软件性能和可扩展性有着重要意义。同时,掌握这些技术也为你在处理...

    python 多线程的同步机制 以python2例程的方式讲解了python 多线程的同步 常用的方法,主要是锁、条件同步、队列

    在Python中,多线程同步机制是通过锁、条件同步和队列来保证数据一致性。使用锁时,线程会竞争获取锁并释放锁,防止并发访问共享资源。条件同步允许线程在满足特定条件后继续执行,而队列则提供了一种线程间安全传递...

    vc 多线程实例同步,异步

    总的来说,理解和掌握VC++中的多线程同步和异步是提升程序性能和稳定性的重要手段。开发者需要深入理解各种线程同步机制,合理运用异步操作,确保代码的正确性和可维护性。在实际项目中,应根据需求选择合适的线程...

    linux上实现多进程和多线程实现同步互斥(源代码)

    在Linux操作系统中,多进程和多线程是两种并发执行的方式,它们在处理并发问题时,经常需要进行同步和互斥操作,以确保数据的一致性和程序的正确性。本篇将详细介绍这两种并发模型以及如何在Linux环境中实现同步互斥...

    C++基于消息队列的多线程实现示例代码

    实现消息队列的关键因素是考量不同线程访问消息队列的同步问题。本实现涉及到几个知识点 std::lock_guard 介绍 std::lock_gurad 是 C++11 中定义的模板类。定义如下: template &lt;class&gt; class lock_guard; lock_...

    多线程和队列下载

    在Android应用开发中,多线程和队列下载是一种常见的技术,用于提高应用程序的性能和用户体验,尤其是在处理大文件下载任务时。这个“多线程和队列下载”项目可能是针对一个商业模式的解决方案,旨在优化资源利用,...

    c++多线程安全的消息队列模板

    在C++编程中,多线程安全的消息队列(Message Queue)是一种常用的数据结构,用于在并发环境中同步和通信。消息队列允许不同线程之间的异步操作,从而提高程序的执行效率。本文将深入探讨如何创建一个多线程安全的...

    SemQueue_多线程_缓存队列_

    综上所述,"SemQueue"是一个实现了多线程和缓存队列功能的组件,它利用信号量实现线程同步,采用FIFO策略进行数据管理,并且具备跨平台的特性,能够在Windows和Linux环境下运行。理解和掌握这样的组件对于提升多线程...

    多线程并发访问无锁队列的算法研究.pdf

    ### 多线程并发访问无锁队列的算法研究 #### 1. 引言 随着多核技术的快速发展,并行数据结构技术成为了研究领域的热点话题。传统的有锁并发访问方式不仅带来了额外的开销,而且有可能导致死锁等问题的发生。因此,...

Global site tag (gtag.js) - Google Analytics