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通信的响应过程.数据缓冲区在文件读写应用等.强大的模型框架,鉴于本人水平有限目前 ...
随机推荐
- 英语发音规则---字母组合ou的发音规律
英语发音规则---字母组合ou的发音规律 一.总结 一句话总结: 1.先练习一下题,单词enough划线部分与下列那个单词划线部分读音相同:A. touch B. mouth C. soul D ...
- Spring MVC的工作原理和机制
Spring MVC的工作原理和机制 参考: springMVC 的工作原理和机制 - 孤鸿子 - 博客园https://www.cnblogs.com/zbf1214/p/5265117.html ...
- poj 3666 Making the Grade(dp离散化)
Making the Grade Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 7068 Accepted: 3265 ...
- hdu 2955 Robberies(01背包)
Robberies Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total S ...
- ES查看segment大小
摘自:http://www.aboutyun.com/thread-17078-1-1.html Segment Memory Segment不是file吗?segment memory又是什么?前面 ...
- phpStudy如何修改端口及WWW目录
phpStudy如何修改端口及WWW目录 phpStudy如何修改端口 请使用『其他选项菜单』-『phpStudy设置』-『端口常规设置』.
- JSP页面跳转
JSP页面跳转 RequestDispatcher.forward() 服务器端起作用,当使用forward()时,Servlet engine传递HTTP请求从当前的Servlet or JSP到 ...
- Tensorflow Summary用法
本文转载自:https://www.cnblogs.com/lyc-seu/p/8647792.html Tensorflow Summary用法 tensorboard 作为一款可视化神器,是学习t ...
- 理解Promise
一.Propmise基本用法 Promise用于发送一个异步完成的结果,是替代回调函数的另一种选择.可以把Promise理解为一种异步函数. 以下函数通过一个Promise来异步地返回一个结果 fun ...
- 串口编程3:使用串口读取GPS信息
关于GPS的使用,参考. 本文主要参考的博客,在此表示感谢!!! 主函数 主函数gps_main.c,这里便涉及到了串口的打开,读操作,以及调用了串口设置函数: #include <stdio. ...