首先给到需要获取和计算的股票,存入一个文本中,如stocks.txt
然后定义个抽象类,用于读取这个stocks.txt中存放的股票信息,并计算出股票的总值和读取花费的时间。代码如下:
01 |
public abstract class AbstractNAV{
|
02 |
public static Map<String,Integer>readTickers() throws IOException{
|
03 |
final BufferedReaderreader=
|
04 |
new BufferedReader( new FileReader( "d:/stocks.txt" ));
|
06 |
final Map<String,Integer>stocks= new HashMap<String,Integer>();
|
09 |
while ((stockInfo=reader.readLine())!= null ){
|
10 |
final String[]stockInfoData=stockInfo.split( "," );
|
11 |
final StringstockTicker=stockInfoData[ 0 ];
|
12 |
final Integerquantity=Integer.valueOf(stockInfoData[ 1 ]);
|
14 |
stocks.put(stockTicker,quantity);
|
20 |
public void timeAndComputeValue()
|
21 |
throws ExecutionException,InterruptedException,IOException{
|
22 |
final long start=System.nanoTime();
|
24 |
final Map<String,Integer>stocks=readTickers();
|
25 |
final double nav=computeNetAssetValue(stocks);
|
27 |
final long end=System.nanoTime();
|
29 |
final Stringvalue= new DecimalFormat( "$##,##0.00" ).format(nav);
|
30 |
System.out.println( "Yournetassetvalueis" +value);
|
31 |
System.out.println( "Time(seconds)taken" +(end-start)/ 1 .0e9);
|
34 |
public abstract double computeNetAssetValue(
|
35 |
final Map<String,Integer>stocks)
|
36 |
throws ExecutionException,InterruptedException,IOException;
|
然后,我们用传统的单线程方式,依次去读取并计算股票,并打印总价和花费的时间,代码如下:
01 |
public class SequentialNAV extends AbstractNAV{
|
02 |
public double computeNetAssetValue(
|
03 |
final Map<String,Integer>stocks) throws IOException{
|
04 |
double netAssetValue= 0.0 ;
|
05 |
for (Stringticker:stocks.keySet()){
|
06 |
netAssetValue+=stocks.get(ticker)*YahooFinance.getPrice(ticker);
|
11 |
public static void main( final String[]args)
|
12 |
throws ExecutionException,IOException,InterruptedException{
|
13 |
new SequentialNAV().timeAndComputeValue();
|
由于网络问题,我这里运行之后,得到的结果是:
1 |
Yournetassetvalueis$ 18 , 317 , 338.21
|
2 |
Time(seconds)taken 18.080151543
|
紧接着,我们用多线程方式,读取并计算,并打印总价和时间花费
01 |
public class ConcurrentNAV extends AbstractNAV{
|
02 |
public double computeNetAssetValue( final Map<String,Integer>stocks)
|
03 |
throws InterruptedException,ExecutionException{
|
04 |
final int numberOfCores=Runtime.getRuntime().availableProcessors();
|
05 |
final double blockingCoefficient= 0.9 ;
|
06 |
final int poolSize=( int )(numberOfCores/( 1 -blockingCoefficient));
|
08 |
System.out.println( "NumberofCoresavailableis" +numberOfCores);
|
09 |
System.out.println( "Poolsizeis" +poolSize);
|
12 |
final List<Callable<Double>>partitions=
|
13 |
new ArrayList<Callable<Double>>();
|
14 |
for ( final Stringticker:stocks.keySet()){
|
15 |
partitions.add( new Callable<Double>(){
|
16 |
public Doublecall() throws Exception{
|
17 |
return stocks.get(ticker)*YahooFinance.getPrice(ticker);
|
23 |
final ExecutorServiceexecutorPool=
|
24 |
Executors.newFixedThreadPool(poolSize);
|
27 |
final List<Future<Double>>valueOfStocks=
|
28 |
executorPool.invokeAll(partitions, 10000 ,TimeUnit.SECONDS);
|
30 |
double netAssetValue= 0.0 ;
|
31 |
for ( final Future<Double>valueOfAStock:valueOfStocks)
|
32 |
netAssetValue+=valueOfAStock.get();
|
34 |
executorPool.shutdown();
|
38 |
public static void main( final String[]args)
|
39 |
throws ExecutionException,InterruptedException,IOException{
|
40 |
new ConcurrentNAV().timeAndComputeValue();
|
在跟上面同等的网络环境下,这段代码运行之后的结果为:
1 |
NumberofCoresavailableis 4
|
3 |
Yournetassetvalueis$ 18 , 317 , 338.21
|
4 |
Time(seconds)taken 0.715660335
|
分享到:
相关推荐
C#多线程互斥实例 多线程获取同一变量(不重复)。是一个很好的学习例子
获取网络时间,对时线程1,对时线程2,对时线程3,对时线程4,对时线程5,对时线程6,对时线程7
CA多线程获取值源码 源码描述: 因为线程是异步操作的,一旦对它Start()就有一种脱离了控制的感觉,尤其是对它最后的运行结果无法获取。在本代码中演示了等待各个线程执行完毕然后在主线程根据各线程返回的值来进行...
C# 动态多线程执行
php多线程获取网页,利用curl_multi同时请求多个url,并发请求,缩短执行等待时间
3、修改insertRecords.py等以"insertRecords"开头的文件中的股票信息路径, 开启定时爬虫crontab -e, 如果对每次执行的时间没有限制 单线程爬虫`insertRecords.py`的参考时间为406秒 多进程爬虫`...
c_多线程c_多线程c_多线程c_多线程c_多线程c_多线程c_多线程c_多线程c_多线程c_多线程c_多线程c_多线程c_多线程c_多线程c_多线程c_多线程c_多线程c_多线程c_多线程c_多线程c_多线程c_多线程c_多线程c_多线程c_多线程...
易语言多线程获取网络时间源码,多线程获取网络时间,获取网络时间,对时线程1,对时线程2,对时线程3,对时线程4,对时线程5,对时线程6,对时线程7
一个简单的例子,C#多线程实现调用外部程序并获取打印结果 一个简单的例子,C#多线程实现调用外部程序并获取打印结果 一个简单的例子,C#多线程实现调用外部程序并获取打印结果 一个简单的例子,C#多线程实现调用...
多线程多线程多线程多线程多线程多线程多线程多线程多线程多线程多线程多线程多线程多线程多线程多线程多线程多线程多线程多线程多线程
(多线程计算 线程一:进行读取文件数据到线程队列,线程二:从线程队列中拉取数据进行MD5计算(抄袭了FFMPEG 播放器的 多线程解码的原理),从进度条可以看出几乎读文件线程与计算线程同步,读文件线程首先读出1个...
策略名称多线程获取多个交易的深度信息策略作者策略描述多线程获取多个交易的深度信息源码 (javascript)i ;// 等
多线程列子多线程列子多线程列子多线程列子多线程列子多线程列子多线程列子多线程列子多线程列子多线程列子多线程列子多线程列子多线程列子多线程列子多线程列子多线程列子多线程列子
qt v4l2多线程视频采集摄像头格式为 yuyv 640 * 480
c#大漠多线程模板
java 多线程 其实就是每个线程都拥有自己的内存空间,多线程之间的通信,比例A线程修改了主内存(main方法的线程)变量,需要把A线程修改的结果同步到主线程中,这时B线程再从主线程获取该变量的值,这样就实现了...
多线程和网络多线程和网络多线程和网络多线程和网络多线程和网络多线程和网络多线程和网络多线程和网络多线程和网络多线程和网络多线程和网络多线程和网络多线程和网络多线程和网络多线程和网络多线程和网络多线程和...
多线程 e语言多线程 e多线程e语言多线程 e多线程e语言多线程 e多线程
多线程聊天多线程聊天多线程聊天多线程聊天多线程聊天多线程聊天多线程聊天多线程聊天多线程聊天多线程聊天多线程聊天多线程聊天
python脚本案例多线程枚举获取wifi信息提取方式是百度网盘分享地址