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通信的响应过程.数据缓冲区在文件读写应用等.强大的模型框架,鉴于本人水平有限目前 ...
随机推荐
- 分析CSS布局中BFC
1.什么是BFC BFC(Block Formatting Context,块级元素格式化上下文)是 W3C CSS 2.1 规范中的一个概念,它决定了元素如何对其内容进行定位,以及与其他元素的关系和 ...
- php 冒泡排序原理
$start = microtime(true); $popArr = array(6,3,23,1,5,100,399,99,66); echo '6,3,23,1,5,100,399,99 ...
- HasnMap的一种遍历方式:Map.Entry 和 Map.entrySet()
1.Map.Entry 和 Map.entrySet()分别是什么? Map.entrySet():根据名字便可知道,这是一个集合,是一个映射项的set. Map.Entry<k,v>: ...
- stl_map.h
stl_map.h // Filename: stl_map.h // Comment By: 凝霜 // E-mail: mdl2009@vip.qq.com // Blog: http://blo ...
- 机器学习:YOLO for Object Detection (一)
最近看了基于CNN的目标检测另外两篇文章,YOLO v1 和 YOLO v2,与之前的 R-CNN, Fast R-CNN 和 Faster R-CNN 不同,YOLO 将目标检测这个问题重新回到了基 ...
- ffmpeg代码实现自定义encoder
1.概述 本文主要讲述如何用ffmpeg代码实现自己的encoder. 2.代码 /* *本程序主要实现一个自己的encoder并加入到encoder链中去,供api调用 *作者:缪国凯(MK) *8 ...
- BZOJ3812 清华集训2014 主旋律
直接求出强联通生成子图的数量较难,不妨用所有生成子图的数量减去非强联通的. 非强联通生成子图在所点后满足编号最小的点所在的强联通分量不是全集. 由于$n$很小,我们可以考虑状态压缩. 对于点集$S$, ...
- 1115. Counting Nodes in a BST (30)
A Binary Search Tree (BST) is recursively defined as a binary tree which has the following propertie ...
- 一. kafka 入门
一.基本概念 Kafka是一种高吞吐量的分布式发布订阅消息系统,它可以处理消费者规模的网站中的所有动作流数据.这种动作(网页浏览,搜索和其他用户的行动)是在现代网络上的许多社会功能的一个关键因素. K ...
- numpy.ones(shape, dtype=None, order='C')
Return a new array of given shape and type, filled with ones. Parameters: shape : int or sequence of ...