`

多线程获取yahoo股票信息

 
阅读更多
首先给到需要获取和计算的股票,存入一个文本中,如stocks.txt
01 AAPL,2505
02 AMGN,3406
03 AMZN,9354
04 BAC,9839
05 BMY,5099
06 CAT,8463
07 C,1500
08 CMCSA,6144
09 CSCO,4589
10 CVX,9696
11 DIS,4804
12 DOW,3654
13 EMC,4835
14 FDX,4753
15 GD,3919
16 GE,7003
17 GOOG,6631
18 HAL,2593
19 HPQ,6157
20 IBM,1728
21 INTC,4053
22 JPM,1665
23 LMT,4402
24 MET,3712
25 MO,3764
26 MSFT,2813
27 NKE,6447
28 NSC,5537
29 ORCL,7136
30 PFE,659
31 RTN,5063
32 S,8219
33 SO,7175
34 TXN,1410
35 USB,3099
36 VZ,9826
37 WMT,6478



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

01 publicabstractclassAbstractNAV{
02 publicstaticMap<String,Integer>readTickers()throwsIOException{
03 finalBufferedReaderreader=
04 newBufferedReader(newFileReader("d:/stocks.txt"));
05
06 finalMap<String,Integer>stocks=newHashMap<String,Integer>();
07
08 StringstockInfo=null;
09 while((stockInfo=reader.readLine())!=null){
10 finalString[]stockInfoData=stockInfo.split(",");
11 finalStringstockTicker=stockInfoData[0];
12 finalIntegerquantity=Integer.valueOf(stockInfoData[1]);
13
14 stocks.put(stockTicker,quantity);
15 }
16
17 returnstocks;
18 }
19
20 publicvoidtimeAndComputeValue()
21 throwsExecutionException,InterruptedException,IOException{
22 finallongstart=System.nanoTime();
23
24 finalMap<String,Integer>stocks=readTickers();
25 finaldoublenav=computeNetAssetValue(stocks);
26
27 finallongend=System.nanoTime();
28
29 finalStringvalue=newDecimalFormat("$##,##0.00").format(nav);
30 System.out.println("Yournetassetvalueis"+value);
31 System.out.println("Time(seconds)taken"+(end-start)/1.0e9);
32 }
33
34 publicabstractdoublecomputeNetAssetValue(
35 finalMap<String,Integer>stocks)
36 throwsExecutionException,InterruptedException,IOException;
37 }

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

01 publicclassSequentialNAVextendsAbstractNAV{
02 publicdoublecomputeNetAssetValue(
03 finalMap<String,Integer>stocks)throwsIOException{
04 doublenetAssetValue=0.0;
05 for(Stringticker:stocks.keySet()){
06 netAssetValue+=stocks.get(ticker)*YahooFinance.getPrice(ticker);
07 }
08 returnnetAssetValue;
09 }
10
11 publicstaticvoidmain(finalString[]args)
12 throwsExecutionException,IOException,InterruptedException{
13 newSequentialNAV().timeAndComputeValue();
14 }
15 }

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

1 Yournetassetvalueis$18,317,338.21
2 Time(seconds)taken18.080151543

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

01 publicclassConcurrentNAVextendsAbstractNAV{
02 publicdoublecomputeNetAssetValue(finalMap<String,Integer>stocks)
03 throwsInterruptedException,ExecutionException{
04 finalintnumberOfCores=Runtime.getRuntime().availableProcessors();
05 finaldoubleblockingCoefficient=0.9;
06 finalintpoolSize=(int)(numberOfCores/(1-blockingCoefficient));
07
08 System.out.println("NumberofCoresavailableis"+numberOfCores);
09 System.out.println("Poolsizeis"+poolSize);
10 //Callable接口的实例,用于被另一个线程执行call(),并返回,无返回则抛出异常。
11 //它类似于Runnable接口,而Runnable不会返回结果,并且无法抛出经过检查的异常。
12 finalList<Callable<Double>>partitions=
13 newArrayList<Callable<Double>>();
14 for(finalStringticker:stocks.keySet()){
15 partitions.add(newCallable<Double>(){
16 publicDoublecall()throwsException{
17 returnstocks.get(ticker)*YahooFinance.getPrice(ticker);
18 }
19 });
20 }
21
22 //定义线程池
23 finalExecutorServiceexecutorPool=
24 Executors.newFixedThreadPool(poolSize);
25 //Future接口的实例,通过get()方法,获取多线程下异步的计算结果。
26 //必要时,计算完成前可阻塞该方法,可通过cancel()取消计算,一旦计算完成,则无法取消。
27 finalList<Future<Double>>valueOfStocks=
28 executorPool.invokeAll(partitions,10000,TimeUnit.SECONDS);
29
30 doublenetAssetValue=0.0;
31 for(finalFuture<Double>valueOfAStock:valueOfStocks)
32 netAssetValue+=valueOfAStock.get();
33
34 executorPool.shutdown();
35 returnnetAssetValue;
36 }
37
38 publicstaticvoidmain(finalString[]args)
39 throwsExecutionException,InterruptedException,IOException{
40 newConcurrentNAV().timeAndComputeValue();
41 }
42 }

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

1 NumberofCoresavailableis4
2 Poolsizeis40
3 Yournetassetvalueis$18,317,338.21
4 Time(seconds)taken0.715660335
分享到:
评论

相关推荐

    基于java爬取股票数据的一个项目.zip

    6. **多线程(Multithreading)**:为提高爬取效率,项目可能采用了多线程或异步处理。每个线程负责爬取一个或多个股票的数据,这样可以并行处理多个请求,减少整体的爬取时间。 7. **数据存储**:抓取到的股票数据...

    基于Python写的一个多线程

    # 使用多线程获取上证50股票数据 symbols = ['SH000001'] # 上证50股票代码示例 threads = [MyThread(target=get_stock_data, args=(symbol,)) for symbol in symbols] for thread in threads: thread.start() # ...

    实时获取股票行情数据

    6. **多线程**:为了不影响用户界面的响应,数据获取和处理过程通常在后台线程执行,使用TThread或Delphi的异步操作。 7. **数据缓存与更新**:为了减少频繁的网络请求,可以采用本地缓存策略,仅在必要时更新数据...

    Excel+VBA+获取股票的历史数据+股票+基金+投资+理财+源代码+可直接使用

    - **多线程**:如果需要同时获取多只股票的数据,可以考虑使用多线程技术,提升效率。 通过以上步骤,你就可以利用VBA在Excel中创建一个自定义工具,轻松获取和分析股票历史数据。这个工具对于个人投资者进行股票...

    yahoo股票数据接口

    通过调用这个接口,我们可以获取到想要的股票信息,并进行进一步的数据分析或应用开发。 要实现一个Java应用程序来获取Yahoo股票数据,我们需要以下步骤: 1. **设置HTTP请求**:使用Java的HttpURLConnection或第...

    获取上证50股票交易数据

    综上所述,通过Python编程,结合Yahoo Finance API、多线程技术和pandas库,我们可以高效地获取和处理上证50成分股的交易数据,为股票市场分析提供基础。同时,项目中还涉及到异常处理、数据存储与解析、数据可视化...

    C# winform 股票分时走势

    本文将深入探讨如何使用C# WinForm来实现股票分时走势的显示功能,以及多线程在其中的应用。 股票分时走势是股票交易中非常重要的一个视觉表示,它展示了股票在特定时间内的价格变化。在C# WinForm中实现这个功能,...

    Python 爬取股票数据源码实现方案

    在Python编程语言中,爬取股票数据是一种常见的任务,尤其对于数据分析、投资研究以及金融建模的从业者来说,这是获取实时或历史股票信息的重要手段。本实现方案将深入探讨如何利用Python来爬取股票数据,并提供相关...

    python股票爬虫

    获取到网页数据后,需要解析其中的股票信息。`BeautifulSoup`库是常用的HTML解析工具,而`json`库则用于解析JSON格式的数据。通过它们,我们可以提取出股票代码、价格、成交量等关键信息。 4. **多线程与多进程**...

    java 实时股票报价系统源代码 NeatBeans

    总的来说,Java实时股票报价系统结合了Java语言的强大功能和NeatBeans IDE的便利性,为用户提供了获取和管理股票信息的有效工具。通过深入研究这个系统的源代码,无论是初学者还是经验丰富的开发者,都能从中学习到...

    获取股市信息和常用开发小功能模块

    首先,`StockInfo.java`可能是一个Java类,用于封装获取股票信息的相关逻辑。这个类可能包含了连接股票数据提供商的接口调用方法,例如Yahoo Finance API、Alpha Vantage、Quandl等。这些API通常会提供实时报价、...

    股票价格实时查询有源码

    4. **多线程**:为了不阻塞主线程,数据获取和解析可能需要在单独的线程中进行,以确保用户界面的响应速度。 5. **用户配置**:允许用户添加或删除关注的股票,这需要在代码中实现动态配置和存储功能。 6. **错误...

    ios应用源码之横条显示滚动的股票动态 2018128

    `NSOperationQueue`和GCD(Grand Central Dispatch)是实现多线程操作的常用工具。 总的来说,这个"ios应用源码之横条显示滚动的股票动态"项目涵盖了iOS应用开发中的多个核心概念,包括界面设计、网络通信、数据...

    VB.NET 北极星股票静态分析系统.rar

    8. **多线程**:为了处理复杂的计算任务或避免UI冻结,系统可能使用后台线程来执行计算,例如计算股票的技术指标。 9. **设计模式**:软件设计中可能运用到一些常见的设计模式,如单例模式(用于数据库连接管理)、...

    Xiaomi_股票实时_港股_小米_

    6. **多线程或异步处理**:实时股票应用通常需要在不阻塞用户界面的情况下获取和处理数据,这可能涉及到多线程或多进程编程,或者是Python的异步I/O模型,如asyncio库。 7. **用户交互设计**:自动隐藏功能反映了...

    Java实时股票价格分析器

    1. 数据获取模块:通过连接到股票市场数据提供商,如Yahoo Finance、Google Finance或专业金融数据服务,获取实时的股票报价、历史数据以及公司新闻等信息。 2. 数据解析模块:接收来自服务器的数据流,并进行解析...

    股票接收通用程序样本

    4. **多线程与并发**:为了实时接收数据,程序可能需要使用多线程或多进程技术,确保数据获取的高效性和及时性。 5. **数据库存储**:接收到的数据通常需要存储在数据库中,以便后续分析和查询,所以SQL知识和...

    Python编写的股票行情分析软件,界面采用Pyqt

    为了实现股票数据的获取,Python有多个库可供选择,如`yfinance`用于获取Yahoo Finance的数据,`pandas_datareader`可以读取Google Finance、Yahoo Finance等平台的数据。数据获取后,`pandas`库常用于数据清洗、...

    delphi 股票程序

    7. **多线程处理**:为了保证界面的流畅性,获取和处理股票数据可能在后台线程中进行,避免阻塞主线程。这需要理解并发编程和线程同步机制,如TThread或异步方法。 8. **错误处理和异常安全**:任何程序都应考虑...

Global site tag (gtag.js) - Google Analytics