肿瘤大数据挖掘中经常需要处理上百亿行的文本文件,这些文件往往高达数百GB,假如文件结构简单统一,那么用sed和awk 处理是非常方便和快速的。但有时候会遇到逻辑较为复杂的处理流程,这样我一般会用JAVA来处理。但由于JAVA是单线程的,因此对于实验室多核服务器来说,能充分有效的利用起每个核会方便不少,那么这个时候就推荐用多线程来并发(并行)处理任务,从而达到运算速度倍速的提升。

  这里举一个并行计算的例子。例子比较简单,主要是对三个数进行累加,最后输出结果。我们分别用单线程和多线程来执行,其中单线程是顺序执行而多线程则同时启动三个线程来并行(服务器CPU数大于三,所以这里是并行而不是并发)执行。

  首先是单线程的运行结果:

public class Nothreading
{
public static void main(String[] args)
{
long startTime = System.currentTimeMillis();
int sum_i = 0;
int sum_j = 0;
int sum_k = 0;
for(int i = 0; i < 10000; i++)
{
sum_i += 1;
       /* 增加程序运行时间, 后面同理 */
for(int a = 0 ; a < 100000 ; a ++)
{
String s = "To cost some time";
String[] ss = s.split(" ");
}
}
for(int j = 0; j < 10000; j++)
{
sum_j += 2;
for(int a = 0 ; a < 100000 ; a ++)
{
String s = "To cost some time";
String[] ss = s.split(" ");
}
}
for(int k = 0; k < 10000; k++)
{
sum_k += 3;
for(int a = 0 ; a < 100000 ; a ++)
{
String s = "To cost some time";
String[] ss = s.split(" ");
}
}
long endTime = System.currentTimeMillis();
System.out.println(sum_i + "\t" + sum_j + "\t" + sum_k);
System.out.println("run time:"+(endTime-startTime)+"ms");
}
}

  运行结果:

run time:663587ms

  图片是该程序运行时的CPU资源利用状态: 可以看到仅有一个CPU的利用率达到100%.

  下面是多线程:

class Count_i
{
public int sum_i = 0;
public synchronized void count()
{
for(int i = 0 ; i < 10000; i++)
{
sum_i += 1;
/* 增加运行时间 后面同理*/
for(int a = 0 ; a < 100000; a ++)
{
String s = "To cost some time";
String[] ss = s.split(" ");
}
}
}
} class Count_j
{
public int sum_j = 0;
public synchronized void count()
{
for(int j = 0 ; j < 10000; j++)
{
sum_j += 2;
for(int a = 0 ; a < 100000; a ++)
{
String s = "To cost some time";
String[] ss = s.split(" ");
}
}
}
} class Count_k
{
public int sum_k = 0;
public synchronized void count()
{
for(int k = 0 ; k < 10000; k++)
{
sum_k += 3;
for(int a = 0 ; a < 100000; a ++)
{
String s = "To cost some time";
String[] ss = s.split(" ");
}
}
}
} class Mul_thread_i extends Thread
{
public Count_i c_i;
public Mul_thread_i(Count_i acc)
{
this.c_i = acc;
}
public void run()
{
c_i.count();
}
} class Mul_thread_j extends Thread
{
public Count_j c_j;
public Mul_thread_j(Count_j acc)
{
this.c_j = acc;
}
public void run()
{
c_j.count();
}
} class Mul_thread_k extends Thread
{
public Count_k c_k;
public Mul_thread_k(Count_k acc)
{
this.c_k = acc;
}
public void run()
{
c_k.count();
}
} public class Threethreading_save
{
public static void main(String[] args) throws InterruptedException
{
long startTime = System.currentTimeMillis();
Count_i ci = new Count_i();
Count_j cj = new Count_j();
Count_k ck = new Count_k();
Mul_thread_i aa = new Mul_thread_i(ci);
Mul_thread_j bb = new Mul_thread_j(cj);
Mul_thread_k cc = new Mul_thread_k(ck); aa.start();
bb.start();
cc.start();
aa.join();
bb.join();
cc.join(); System.out.println(ci.sum_i);
System.out.println(cj.sum_j);
System.out.println(ck.sum_k);
long endTime = System.currentTimeMillis();
System.out.println("run time:"+(endTime-startTime)+"ms");
}
}

  下面是运行结果:

10000
20000
30000
run time:221227ms

  CPU状态:可以看到有三个CPU的利用率达到100%.

空闲时的状态:

  总结一些,当我们处理的任务量很大的时候,如果计算机有多个CPU,可以将待处理的任务合理的分为几个部分,然后开几个线程同时进行运算,等这些子任务都完成以后再交给主线程后续的处理,可以看到效率成倍的提升。当然线程安全是一个需要注意的问题,由于时间关系后面将详细介绍。

利用JAVA多线程来提高数据处理效率的更多相关文章

  1. GitHub Java项目推荐|功能丰富的 Java 工具包|提高开发效率

    GitHub Java项目推荐|功能丰富的 Java 工具包|提高开发效率 功能丰富的 Java 工具包.它帮助我们实现了常用的工具方法,从而减少代码的体积,提高开发效率.该项目最初是作者工作项目中的 ...

  2. 如何优化JAVA代码及提高执行效率

    可供程序利用的资源(内存.CPU时间.网络带宽等)是有限的,优化的目的就是让程序用尽可能少的资源完成预定的任务.优化通常包含两方面的内容:减小代码的体积,提高代码的运行效率.本文讨论的主要是如何提高代 ...

  3. (原创)JAVA多线程一传统多线程

    一,多线程 多线程是提高程序效率,避免资源浪费的很好的解决方案,下面来慢慢的介绍多线程的一些基本知识,而这些是晋级高级不可或缺的一部分 1,Thread类 类实现多线程需要实现Runnable接口,我 ...

  4. java 多线程 22 :生产者/消费者模式 进阶 利用await()/signal()实现

    java多线程15 :wait()和notify() 的生产者/消费者模式 在这一章已经实现了  wait/notify 生产消费模型 利用await()/signal()实现生产者和消费者模型 一样 ...

  5. 在一个千万级的数据库查寻中,如何提高查询效率?分别说出在数据库设计、SQL语句、java等层面的解决方案。

    在一个千万级的数据库查寻中,如何提高查询效率?分别说出在数据库设计.SQL语句.java等层面的解决方案. 解答: 1)数据库设计方面: a. 对查询进行优化,应尽量避免全表扫描,首先应考虑在 whe ...

  6. 如何利用 Visual Studio 自带工具提高开发效率

    Visual Stuido 是一款强大的Windows 平台集成开发工具,你是否好好地利用了它呢? 显示行号 有些时候(比如错误定位)的时候,显示行号将有利于我们进行快速定位. 如何显示 1. 工具 ...

  7. tomcat免重启随意更改java代码 提高开发效率

    转载:http://developer.51cto.com/art/201012/241243.htm 做为了一个java开发人员,总是为因为要增加一个类,或是增加删除一个方法,甚至修改一个小处代码而 ...

  8. 【Java】能提高日常工作效率的一些Java函数

    自编工具总是临时抱佛脚来得顺溜,宜常备手边以提高工作效率: package com.hy; import java.io.File; /** * 日常工作常用的一些工具方法 * @author 逆火 ...

  9. JAVA多线程提高十四: 面试题

    前面针对多线程相关知识点进行了学习,那么我们来来看看常见的面试题: 1. 空中网面试题1 package com.kongzhongwang.interview; import java.util.c ...

随机推荐

  1. hdu1249 三角形分割平面---递推

    题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=1249 题目大意: 用N个三角形最多可以把平面分成几个区域? 思路: 知道了直线和折线分割平面的情况这 ...

  2. monogodb3.4安装修改,权限设置

    下载地址:https://www.mongodb.com/download-center#community 这里的方法只对应3.4,别的有没有效果请自行判断. 下载后按默认下一步. 默认安装地址  ...

  3. [转]pymongo常用操作函数

    pymongo 是 mongodb 的 python Driver Editor.记录下学习过程中感觉以后会常用多一些部分,以做参考. 1. 连接数据库 要使用pymongo最先应该做的事就是先连上运 ...

  4. anaconda的使用

    1. 查看已安装的库 pip list conda list 其中,pip list 只能查看库,而 conda list 则可以查看库以及库的版本 2. 安装或更新库 pip install scr ...

  5. Linux正则表达式总结【网络资源整理】

    正则表达式的分类 1.基本的正则表达式(Basic Regular Expression 又叫Basic RegEx 简称BREs) 2.扩展的正则表达式(Extended Regular Expre ...

  6. PHP性能优化利器:生成器 yield理解

    如果是做Python或者其他语言的小伙伴,对于生成器应该不陌生.但很多PHP开发者或许都不知道生成器这个功能,可能是因为生成器是PHP 5.5.0才引入的功能,也可以是生成器作用不是很明显.但是,生成 ...

  7. [LeetCode] Self Dividing Numbers 自整除数字

    A self-dividing number is a number that is divisible by every digit it contains. For example, 128 is ...

  8. [ZJOI 2012]灾难

    Description 阿米巴是小强的好朋友. 阿米巴和小强在草原上捉蚂蚱.小强突然想,果蚂蚱被他们捉灭绝了,那么吃蚂蚱的小鸟就会饿死,而捕食小鸟的猛禽也会跟着灭绝,从而引发一系列的生态灾难. 学过生 ...

  9. [HNOI2014]画框

    题目描述 小T准备在家里摆放几幅画,为此他买来了N幅画和N个画框.为了体现他的品味,小T希望能合理地搭配画与画框,使得其显得既不过于平庸也不太违和. 对于第 幅画与第 个画框的配对,小T都给出了这个配 ...

  10. [SDOI2016]硬币游戏

    题目描述 Alice 和 Bob 现在在玩的游戏,主角是依次编号为 1 到 n 的 n 枚硬币.每一枚硬币都有两面,我们分别称之为正面和反面.一开始的时候,有些硬币是正面向上的,有些是反面朝上的.Al ...