java 多线程学习笔记(二) -- IO密集型任务
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密集型任务的更多相关文章
- java多线程学习笔记——详细
一.线程类 1.新建状态(New):新创建了一个线程对象. 2.就绪状态(Runnable):线程对象创建后,其他线程调用了该对象的start()方法.该状态的线程位于可运行线程池中, ...
- JAVA多线程学习笔记(1)
JAVA多线程学习笔记(1) 由于笔者使用markdown格式书写,后续copy到blog可能存在格式不美观的问题,本文的.mk文件已经上传到个人的github,会进行同步更新.github传送门 一 ...
- Java多线程学习笔记(一)——多线程实现和安全问题
1. 线程.进程.多线程: 进程是正在执行的程序,线程是进程中的代码执行,多线程就是在一个进程中有多个线程同时执行不同的任务,就像QQ,既可以开视频,又可以同时打字聊天. 2.线程的特点: 1.运行任 ...
- Java多线程学习(二)synchronized关键字(2)
转载请备注地址:https://blog.csdn.net/qq_34337272/article/details/79670775 系列文章传送门: Java多线程学习(一)Java多线程入门 Ja ...
- Java多线程学习(二)synchronized关键字(1)
转载请备注地址: https://blog.csdn.net/qq_34337272/article/details/79655194 Java多线程学习(二)将分为两篇文章介绍synchronize ...
- Java多线程学习笔记
进程:正在执行中的程序,其实是应用程序在内存中运行的那片空间.(只负责空间分配) 线程:进程中的一个执行单元,负责进程汇总的程序的运行,一个进程当中至少要有一个线程. 多线程:一个进程中时可以有多个线 ...
- java 多线程学习笔记(一) -- 计算密集型任务
最近在看<Java虚拟机并发编程>,在此记录一些重要的东东. 线程数的确定:1. 获取系统可用的处理器核心数:int numOfCores = Runtime.getRuntime().a ...
- java 多线程学习笔记
这篇文章主要是个人的学习笔记,是以例子来驱动的,加深自己对多线程的理解. 一:实现多线程的两种方法 1.继承Thread class MyThread1 extends Thread{ public ...
- Java多线程学习笔记--生产消费者模式
实际开发中,我们经常会接触到生产消费者模型,如:Android的Looper相应handler处理UI操作,Socket通信的响应过程.数据缓冲区在文件读写应用等.强大的模型框架,鉴于本人水平有限目前 ...
随机推荐
- 分享知识-快乐自己:快速理解(Java内部类)
1):成员内部类 什么是内部类?: 内部类就是在一个类中定义另一个类. 定义语法: 使用命令行查看编译 产生的文件: 如何生成内部类对象? 创建规则:内部类对象 需要先声明外部类对象. 内部类以及外部 ...
- 1.start
1. react-native init Helloworld // 创建 helloworld 工程 2. 进入 helloworld ->android, 运行 react-navite ...
- Java_注解_异常_01_ElementType cannot be resolved to a variable
一.异常现象: 自定义注解时, @Retention和@Target都能导入进来,但是却报下列错误: RetentionPolicy cannot be resolved to a variable ...
- 51nod 1829(函数)
题目链接:https://www.51nod.com/onlineJudge/questionCode.html#!problemId=1829 本题目相当于: n个不同的小球,放入到m个可区分的盒子 ...
- Python 标准库 —— 邮件(email)与邮件服务器(smtplib)
你真的懂邮件吗?邮件包括如下四部分内容: 发送人:from_addr 接收人:to_addr 主题:subject 正文:msg(mime text 格式文本) 其中发送者,接收者,又需要两部分的内容 ...
- OpenCV——百叶窗
参考: PS 图像特效,百叶窗 // define head function #ifndef PS_ALGORITHM_H_INCLUDED #define PS_ALGORITHM_H_INCLU ...
- 前向纠错码(FEC)的RTP荷载格式
http://www.rosoo.net/a/201110/15146.html 本文档规定了一般性的前向纠错的媒体数据流的RTP打包格式.这种格式针对基于异或操作的FEC算法进行了特殊设计,它允许终 ...
- 系列文章--AJAX技术系列总结
各种AJAX方法的使用比较 用ASP.NET写个SQLSERVER的小工具 写自己的ASP.NET MVC框架(下) 写自己的ASP.NET MVC框架(上) 用Asp.net写自己的服务框架 ...
- 在屏幕中间显示,按ESC键后改变字符的颜色
程序功能:编写程序在屏幕中间显示“a”~“z”,并可以让人看清,这个任务比较好实现. (1)在b800:[ 160*12+40*2]处存入a的ASCII码.(2)在循环中使用一个10000000000 ...
- PLSQL Developer安装、配置、连接oracle数据库
0.资源准备 1) PLSQL Developer安装包(由于安装包超过10M,无法上传,请自行下载) 2) instantclient_11_2安装包(由于安装包超过10M,无法上传,请自行下载) ...