文档章节

多线程获取yahoo股票信息(笔记)

phantome
 phantome
发布于 2014/04/15 14:54
字数 711
阅读 326
收藏 10

    首先给到需要获取和计算的股票,存入一个文本中,如stocks.txt

AAPL,2505
AMGN,3406
AMZN,9354
BAC,9839
BMY,5099
CAT,8463
C,1500
CMCSA,6144
CSCO,4589
CVX,9696
DIS,4804
DOW,3654
EMC,4835
FDX,4753
GD,3919
GE,7003
GOOG,6631
HAL,2593
HPQ,6157
IBM,1728
INTC,4053
JPM,1665
LMT,4402
MET,3712
MO,3764
MSFT,2813
NKE,6447
NSC,5537
ORCL,7136
PFE,659
RTN,5063
S,8219
SO,7175
TXN,1410
USB,3099
VZ,9826
WMT,6478

       


            然后定义个抽象类,用于读取这个stocks.txt中存放的股票信息,并计算出股票的总值和读取花费的时间。代码如下:

public abstract class AbstractNAV {
  public static Map<String, Integer> readTickers() throws IOException {
    final BufferedReader reader = 
      new BufferedReader(new FileReader("d:/stocks.txt"));
    
    final Map<String, Integer> stocks = new HashMap<String, Integer>();
    
    String stockInfo = null;
    while((stockInfo = reader.readLine()) != null) {
      final String[] stockInfoData = stockInfo.split(",");
      final String stockTicker = stockInfoData[0];
      final Integer quantity = Integer.valueOf(stockInfoData[1]);
      
      stocks.put(stockTicker, quantity); 
    }
    
    return stocks;    
  }
   
  public void timeAndComputeValue() 
    throws ExecutionException, InterruptedException, IOException { 
    final long start = System.nanoTime();
    
    final Map<String, Integer> stocks = readTickers();
    final double nav = computeNetAssetValue(stocks);    
    
    final long end = System.nanoTime();

    final String value = new DecimalFormat("$##,##0.00").format(nav);
    System.out.println("Your net asset value is " + value);
    System.out.println("Time (seconds) taken " + (end - start)/1.0e9);
  }

  public abstract double computeNetAssetValue(
    final Map<String, Integer> stocks) 
    throws ExecutionException, InterruptedException, IOException;
}

        

        然后,我们用传统的单线程方式,依次去读取并计算股票,并打印总价和花费的时间,代码如下:

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

            由于网络问题,我这里运行之后,得到的结果是:

Your net asset value is $18,317,338.21
Time (seconds) taken 18.080151543

            

            紧接着,我们用多线程方式,读取并计算,并打印总价和时间花费

public class ConcurrentNAV extends AbstractNAV {
    public double computeNetAssetValue(final Map<String, Integer> stocks)
            throws InterruptedException, ExecutionException {
        final int numberOfCores = Runtime.getRuntime().availableProcessors();
        final double blockingCoefficient = 0.9;
        final int poolSize = (int)(numberOfCores / (1 - blockingCoefficient));

        System.out.println("Number of Cores available is " + numberOfCores);
        System.out.println("Pool size is " + poolSize);
        //Callable接口的实例,用于被另一个线程执行call(),并返回,无返回则抛出异常。
        //它类似于Runnable接口,而Runnable 不会返回结果,并且无法抛出经过检查的异常。 
        final List<Callable<Double>> partitions =
                new ArrayList<Callable<Double>>();
        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);
        //Future接口的实例,通过get()方法,获取多线程下异步的计算结果。
        //必要时,计算完成前可阻塞该方法,可通过cancel()取消计算,一旦计算完成,则无法取消。
        final List<Future<Double>> valueOfStocks =
                executorPool.invokeAll(partitions, 10000, TimeUnit.SECONDS);

        double netAssetValue = 0.0;
        for(final Future<Double> valueOfAStock : valueOfStocks)
            netAssetValue += valueOfAStock.get();

        executorPool.shutdown();
        return netAssetValue;
    }

    public static void main(final String[] args)
            throws ExecutionException, InterruptedException, IOException {
        new ConcurrentNAV().timeAndComputeValue();
    }
}

        在跟上面同等的网络环境下,这段代码运行之后的结果为:

Number of Cores available is 4
Pool size is 40
Your net asset value is $18,317,338.21
Time (seconds) taken 0.715660335


© 著作权归作者所有

phantome
粉丝 17
博文 280
码字总数 328011
作品 0
浦东
程序员
私信 提问
基于yahoo股票接口获取股票交易数据

一直想写个程序分析股票数据,无奈找不到数据源,昨天发现雅虎有开放的股票接口。鸡冻。先写个工具类,为后面分析数据做个准备。 废话不多说,上代码! /** * 股票实体类 * @author 祁丛生 ...

番茄炒鸡蛋
2013/01/03
9.9K
5
使用 Yahoo! Finance stock API 获取股票数据

本站曾介绍过,通过代码添加雅虎财经的股票走势图到自己网站的方法(添加美国股市,添加沪深股市),调用的是一张图片。今天在德馨网站,看到了从雅虎财经频道获取股票数据的API(Yahoo! Fi...

不由分说
2012/09/17
12.7K
0
YahooFinance

YahooFinance是一个从finance.yahoo.com获得股市信息的Ruby模块。它可以获取股票数据和历史数据。它能作为一个类库使用,也可以通过命令行调用。 安装方法:gem install yahoofinance 使用方...

匿名
2009/04/01
1K
0
JAVA和Go语言的多线程并发测试二

以前做过一次Go和Java的多线程并发对比测试(Java、Scala和Go语言多线程并发对比测试)。当时,测试所采用的例子是CPU运算密集型的,会占用大量的CPU资源。测试的结果Go并不占优势,可能的原...

qinhui99
2012/06/05
3.9K
4
全方位解读 Google 拆股

在昨天举行的2012年第一季度Google财报会议上,Google宣布拆股,这个举动非常奇怪,大家脑海里一定充满了各种问号,尤其是对我们这些对股票半懂不懂的人来说,下面就是来自SAI的全方位解读,...

虫虫
2012/04/16
1K
6

没有更多内容

加载失败,请刷新页面

加载更多

SpringBoot中 集成 redisTemplate 对 Redis 的操作(二)

SpringBoot中 集成 redisTemplate 对 Redis 的操作(二) List 类型的操作 1、 向列表左侧添加数据 Long leftPush = redisTemplate.opsForList().leftPush("name", name); 2、 向列表右......

TcWong
今天
4
0
排序––快速排序(二)

根据排序––快速排序(一)的描述,现准备写一个快速排序的主体框架: 1、首先需要设置一个枢轴元素即setPivot(int i); 2、然后需要与枢轴元素进行比较即int comparePivot(int j); 3、最后...

FAT_mt
昨天
4
0
mysql概览

学习知识,首先要有一个总体的认识。以下为mysql概览 1-架构图 2-Detail csdn |简书 | 头条 | SegmentFault 思否 | 掘金 | 开源中国 |

程序员深夜写bug
昨天
10
0
golang微服务框架go-micro 入门笔记2.2 micro工具之微应用利器micro web

micro web micro 功能非常强大,本文将详细阐述micro web 命令行的功能 阅读本文前你可能需要进行如下知识储备 golang分布式微服务框架go-micro 入门笔记1:搭建go-micro环境, golang微服务框架...

非正式解决方案
昨天
7
0
前端——使用base64编码在页面嵌入图片

因为页面中插入一个图片都要写明图片的路径——相对路径或者绝对路径。而除了具体的网站图片的图片地址,如果是在自己电脑文件夹里的图片,当我们的HTML文件在别人电脑上打开的时候图片则由于...

被毒打的程序猿
昨天
9
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部