IO密集型是指对IO操作较多的任务。下面以查询一些股票价格任务为例:

YahooFinance.java

public class YahooFinance {

    public static double getPrice(final String ticker) throws IOException{
final URL url = new URL("http://ichart.finance.yahoo.com/table.csv?s=" + ticker);
final BufferedReader reader = new BufferedReader(new InputStreamReader(url.openStream())); String discardHeader = reader.readLine();
System.out.println(discardHeader); String data = reader.readLine();
//Sample of data:
//Date,Open,High,Low,Close,Volume,Adj Close
//2016-09-05,9.08,9.12,8.98,9.02,16212600,9.02
//System.out.println(data);
String[] dataItems = data.split(",");
double price = Double.valueOf(dataItems[dataItems.length - 1]);
return price;
} public static void main(String[] args) throws IOException{
YahooFinance.getPrice("600401.SS");
}
}

AbstractCalTotal.java 顺序查询和多线程查询的基类

public abstract class AbstractCalTotal {
private static String[] stockArr = {
"600401.SS,100", "600120.SS,200", "600728.SS,300", "600268.SS,400", "601258.SS,500",
//"AMGN,100", "AMZN,200", "BAC,300", "AAPL,400", "HYGF,500",
//"ZHFJ,100", "dlkg,200", "BMY,300", "KDXF,400", "CWSZ,500",
//"FZDJ,100", "GDNZ,200", "htdl,300", "zsyh,400", "JLQC,500",
//"JMGF,100", "PDJT,200", "GLM,300", "ZGQY,400", "hyjx,500",
};//股票代码.上交所(深交所),股票数量 public static Map<String, Integer> readTickers() throws IOException{
Map<String, Integer> stocks = new HashMap<>(); String[] info = null;
for(int i = 0 ; i < stockArr.length; i++){
info = stockArr[i].split(",");
stocks.put(info[0], Integer.valueOf(info[1]));
}
return stocks;
} public void timeAndComputeValue() throws ExecutionException, InterruptedException, IOException{
long start = System.nanoTime();
Map<String, Integer> stocks = readTickers();
double nav = computeNetAssetValue(stocks);
long end = System.nanoTime(); String value = new DecimalFormat("$##,##0.00").format(nav);
System.out.println("Total net asset value: " + value);
System.out.println("Time (seconds) taken: " + (end - start)/1.0e9);
} public abstract double computeNetAssetValue(Map<String, Integer> stocks) throws ExecutionException, InterruptedException, IOException;
}

顺序查询

public class SequentialCal extends AbstractCalTotal{

    @Override
public double computeNetAssetValue(Map<String, Integer> stocks)throws IOException {
double values = 0.0;
for(String ticker : stocks.keySet()){
values += stocks.get(ticker)* YahooFinance.getPrice(ticker);
}
return values;
} public static void main(String[] args)throws ExecutionException, InterruptedException, IOException{
new SequentialCal().timeAndComputeValue();
}
}

多线程查询

//调整 blockingCoefficient,可找出较少的执行时间
public class ConcurrentCal extends AbstractCalTotal{ public double computeNetAssetValue(final Map<String, Integer> stocks)
throws ExecutionException, InterruptedException, IOException {
int numberOfCores = Runtime.getRuntime().availableProcessors();
double blockingCoefficient = 0.9;
final int poolSize = (int)(numberOfCores / (1 - blockingCoefficient)); System.out.println("Pool size is: " + poolSize); List<Callable<Double>> partitions = new ArrayList<>();
for(final String ticker : stocks.keySet()){
partitions.add(new Callable<Double>(){
public Double call() throws Exception{
return stocks.get(ticker) * YahooFinance.getPrice(ticker);
}
});
} final ExecutorService executorPool = Executors.newFixedThreadPool(poolSize);
final List<Future<Double>> valueOfStocks = executorPool.invokeAll(partitions, 100, TimeUnit.SECONDS); double netAssetValue = 0.0; //每次循环只能取到一个子任务的结果,且子任务的顺序与我们创建的顺序是一致的。
for(final Future<Double> vas : valueOfStocks){
netAssetValue += vas.get(); //vas.get() 如果此任务尚未完成,程序会等待
} executorPool.shutdown();
return netAssetValue; } public static void main(String[] args)throws ExecutionException, InterruptedException, IOException{
new ConcurrentCal().timeAndComputeValue();
}
}

java 多线程学习笔记(二) -- IO密集型任务的更多相关文章

  1. java多线程学习笔记——详细

    一.线程类  1.新建状态(New):新创建了一个线程对象.        2.就绪状态(Runnable):线程对象创建后,其他线程调用了该对象的start()方法.该状态的线程位于可运行线程池中, ...

  2. JAVA多线程学习笔记(1)

    JAVA多线程学习笔记(1) 由于笔者使用markdown格式书写,后续copy到blog可能存在格式不美观的问题,本文的.mk文件已经上传到个人的github,会进行同步更新.github传送门 一 ...

  3. Java多线程学习笔记(一)——多线程实现和安全问题

    1. 线程.进程.多线程: 进程是正在执行的程序,线程是进程中的代码执行,多线程就是在一个进程中有多个线程同时执行不同的任务,就像QQ,既可以开视频,又可以同时打字聊天. 2.线程的特点: 1.运行任 ...

  4. Java多线程学习(二)synchronized关键字(2)

    转载请备注地址:https://blog.csdn.net/qq_34337272/article/details/79670775 系列文章传送门: Java多线程学习(一)Java多线程入门 Ja ...

  5. Java多线程学习(二)synchronized关键字(1)

    转载请备注地址: https://blog.csdn.net/qq_34337272/article/details/79655194 Java多线程学习(二)将分为两篇文章介绍synchronize ...

  6. Java多线程学习笔记

    进程:正在执行中的程序,其实是应用程序在内存中运行的那片空间.(只负责空间分配) 线程:进程中的一个执行单元,负责进程汇总的程序的运行,一个进程当中至少要有一个线程. 多线程:一个进程中时可以有多个线 ...

  7. java 多线程学习笔记(一) -- 计算密集型任务

    最近在看<Java虚拟机并发编程>,在此记录一些重要的东东. 线程数的确定:1. 获取系统可用的处理器核心数:int numOfCores = Runtime.getRuntime().a ...

  8. java 多线程学习笔记

    这篇文章主要是个人的学习笔记,是以例子来驱动的,加深自己对多线程的理解. 一:实现多线程的两种方法 1.继承Thread class MyThread1 extends Thread{ public ...

  9. Java多线程学习笔记--生产消费者模式

    实际开发中,我们经常会接触到生产消费者模型,如:Android的Looper相应handler处理UI操作,Socket通信的响应过程.数据缓冲区在文件读写应用等.强大的模型框架,鉴于本人水平有限目前 ...

随机推荐

  1. Python基础-操作mysql

    mysql 属于第三方模块,需要先安装 pip install pymysql,sql执行后,数据获取函数有三种cur.fetchone()#获取第一条数据,依次类推下去,第二次执行时候,就会取除去第 ...

  2. 2018.6.21 HOLTEK HT49R70A-1 Source Code analysis

    Cange note: “Reading TMR1H will latch the contents of TMR1H and TMR1L counter to the destination”? F ...

  3. SQL语言方方面面

    1 数据库和SQL 1.1 数据库 DB, DBMS DBMS的种类: 层次性数据库, 关系型数据库, 非关系型数据库 RDBMS, 关系数据库管理系统 1.2 数据库的结构 RDBMS常见的系统结构 ...

  4. 如何实现1080P延迟低于500ms的实时超清直播传输技术

    再来当一次技术搬运工,内容来自高可用框架,学霸君工程师袁荣喜的如何实现1080P延迟低于500ms的实时超清直播传输技术. 导语:视频直播是很多技术团队及架构师关注的问题,在实时性方面,大部分直播是准 ...

  5. 2017-2018-1 20179215《Linux内核原理与分析》第六周作业

    一.实验部分:使用gdb跟踪分析一个系统调用内核函数(上周选择的那一个系统调用). [第一部分] 根据要求完成第一部分,步骤如下: ①更新menu代码到最新版 ②在原有代码中加入C函数.汇编函数 in ...

  6. sqlite表结构动态读取工具(Chole ORM框架)

    Chole ORM框架 sqlIte于嵌入式数据库读取比较有利,不需要安装office也可以进行,可以在服务器系统当中使用. 所以我开发了这款工具,然后就是为了动态的读取表结构,然后根据表结构加载所有 ...

  7. [转]关于新一轮QQ Tencent://Message 在线联系

    关于在线QQ代码. 以前的QQ代码都需要添加好友. 现在的 首先是到http://wp.qq.com/生成你的QQ在线代码 很长的一段代码,并且每个QQ生成的sigT字符串都是不一样的.. 闲来无事, ...

  8. bzoj 3994 约数个数和 —— 反演+数论分块

    题目:https://www.lydsy.com/JudgeOnline/problem.php?id=3994 推导过程和这里一样:https://www.cnblogs.com/MashiroSk ...

  9. 最长递增子序列(LIS)

    最长递增子序列(Longest Increasing Subsequence) ,我们简记为 LIS. 题:求一个一维数组arr[i]中的最长递增子序列的长度,如在序列1,-1,2,-3,4,-5,6 ...

  10. 【转】 Pro Android学习笔记(六五):安全和权限(2):权限和自定义权限

    目录(?)[-] 进程边界 声明和使用权限 AndroidManifestxml的许可设置 自定义权限 运行安全通过两个层面进行保护.进程层面:不同应用运行在不同的进程,每个应用有独自的user ID ...