国产xxxx99真实实拍_久久不雅视频_高清韩国a级特黄毛片_嗯老师别我我受不了了小说

資訊專欄INFORMATION COLUMN

基于LinkedBlockingQueue實現(xiàn)股票交易系統(tǒng)

30e8336b8229 / 3325人閱讀

摘要:與基于數(shù)組的隊列相同,重載的構(gòu)造函數(shù)可以接受集合指定的初始值。這種隊列比基于數(shù)組阻塞隊列具有更高的吞吐量。創(chuàng)建個交易者實例,將自己出售的訂單放入隊列中,每個出售訂單都將會有隨機的交易量。要使用基于優(yōu)先級的隊列,需要提供適當?shù)谋容^器。

阻塞隊列

在阻塞隊列的幫助下,許多同步問題都可以被公式化。阻塞隊列是隊列,當線程試圖對空隊列進行出列操作,或試圖向滿的隊列中插入條目時,隊列就會阻塞。直到其他線程向隊列中放入數(shù)據(jù)時才可以移除,同樣,直到其他線程從隊列中移除條目之后才可以加入。通過使用 輪詢或等待-通知機制可以實現(xiàn)阻塞隊列。就輪詢機制來說,讀線程周期性的調(diào)用隊列的get方法,直到隊列的消息變?yōu)榭捎谩V劣诘却?通知機制,讀線程僅僅是等待隊列對象,隊列對象會在有條目時通知線程。

阻塞隊列的特征

阻塞隊列的典型特征可以概括如下:

阻塞隊列提供了方法來向其中添加條目。這些方法的調(diào)用都是阻塞調(diào)用的,其中條目的插入必須等待,直到隊列的空間變?yōu)榭捎谩?/p>

隊列提供了方法來從中刪除條目,對這些方法的調(diào)用同樣是阻塞調(diào)用的。調(diào)用者會等待條目被放入空隊列

add和remove方法可以選擇性地為它們的等待操作提供超時并可能被中斷

put和take操作在多帶帶的線程中實現(xiàn),從而在兩種類型的操作之間提供了良好的絕緣性

不能像阻塞隊列中插入null元素

阻塞隊列可能受容量的限制

阻塞隊列的實現(xiàn)是線程安全的,然而批量操作,比如addAll,沒有必要一定原子地執(zhí)行,

阻塞隊列在本質(zhì)上不支持“關(guān)閉”或“停止”操作,這表示沒有更多的條目可添加

LinkedBlockingQueue

LinkedBlockingQueue是通過將阻塞隊列的最大容量變?yōu)榭勺儯M而擴展了數(shù)據(jù)阻塞隊列的概念。你仍然可以在指定容量已禁止過度擴容。如果不指定容量,默認值是最大的整數(shù)值。沒有容量限制是由好處的,因為如果先飛著晚于預(yù)訂時間選取條目,生產(chǎn)者無需等待。與基于數(shù)組的隊列相同,重載的構(gòu)造函數(shù)可以接受集合指定的初始值。這種隊列比基于數(shù)組阻塞隊列具有更高的吞吐量。但同時也有較少的可預(yù)見性。除了移除操作在線性時間運行之外,隊列的大多數(shù)操作都是在常數(shù)時間內(nèi)運行的。

PriorityBlockingQueue

PriorityBlockingQueue是無界隊列,可以決定元素的優(yōu)先順序,優(yōu)先級可以由元素的自然順序或你提供的比較器來確定。依照優(yōu)先級隊列的順序,視圖插入不可比較的對象會導(dǎo)致ClassCastException異常。如果系統(tǒng)資源耗盡,雖然是無界隊列,添加操作也會失敗,

股票交易系統(tǒng)
package com.guo.chap18;
import java.io.IOException;
import java.util.concurrent.BlockingQueue;
import java.util.concurrent.LinkedBlockingQueue;

/**
 * Created by guo on 17/2/2018.
 * 基于阻塞隊列的股票交易服務(wù)器
 * 需求:
 *      1、允許交易者往隊列中添加出售訂單,也可以獲取待辦的訂單
 *      2、在任何給定的時間,如果隊列已滿,交易者就不得不等待某個位置變?yōu)榭? *      3、購買者必須等待,直到隊列中有出售訂單可用。
 *      4、為了簡化情形,假設(shè)買方總是必須購買全額數(shù)量的可供出售的股票,不可以部分購買。
 */
public class StockExchange {

    public static void main(String[] args) {
        System.out.printf("Hit Enter to terminate %n%n");
        //1、創(chuàng)建LinkedBlockingQueue實例,因為是無限容量,所以交易者可以把任何數(shù)量的訂單放入隊列中,
        //   如果使用ArrayBlockingQueue,那么將會限制每只股票擁有有限次數(shù)的交易。
        BlockingQueue orderQueue = new LinkedBlockingQueue<>();
        //2、創(chuàng)建Seller賣家實例,Seller是Runnable的實現(xiàn)類。
        Seller seller = new Seller(orderQueue);
        //3、創(chuàng)建100個交易者實例,將自己出售的訂單放入隊列中,每個出售訂單都將會有隨機的交易量。
        Thread[] sellerThread = new Thread[100];
        for (int i = 0; i < 100; i++) {
             sellerThread[i] = new Thread(seller);
             sellerThread[i].start();
        }
        //4、創(chuàng)建100個買家實例,選取待售的訂單
        Buyer buyer = new Buyer(orderQueue);
        Thread[] buyserThread = new Thread[100];
        for (int i = 0; i < 100; i++) {
            buyserThread[i] = new Thread(buyer);
            buyserThread[i].start();
        }
        try {
            //5、一旦創(chuàng)建生產(chǎn)者和消費者線程,他們會永遠保持運行,將訂單放入隊列以及從隊列中獲取訂單
            //   根據(jù)給定時間的負載情況,定期自我阻塞,終止應(yīng)用程序的方法是用戶在鍵盤上按下Enter鍵。
            while (System.in.read() != "
");
        } catch (IOException e) {
            e.printStackTrace();
        }
        //6、main函數(shù)會中斷所有正在運行的生產(chǎn)者和消費者線程,要求它們中指并退出
        System.out.println("Terminating");
        for (Thread t : sellerThread) {
            t.interrupt();
        }
        for (Thread t : buyserThread) {
            t.interrupt();
        }

    }
}
賣家和買家
/**
 * 賣家
 * Seller類實現(xiàn)了Runnable接口并提供了以O(shè)rderQueue作為參數(shù)的構(gòu)造函數(shù)
 */
class  Seller implements Runnable {
    private BlockingQueue orderQueue;
    private boolean shutdownRequest = false;
    private static int id;
    public Seller(BlockingQueue orderQueue) {
        this.orderQueue = orderQueue;
    }
    @Override
    public void run() {
        while (shutdownRequest == false) {
            //1、在每一次迭代中,為每一次的交易量生產(chǎn)一個隨機數(shù)
            Integer quantity = (int) (Math.random() * 100);
            try {
                //2、調(diào)用put方法,將訂單放入隊列中,這是阻塞調(diào)用,只有在隊列容量有限的情況下,
                //    線程才需要等待隊列中有出現(xiàn)空的位置
                orderQueue.put(quantity);
                //3、為了方便用戶,在控制臺打印銷售訂單的詳細信息,以及用于放置銷售訂單的線程詳細信息
                System.out.println("Sell order by" + Thread.currentThread().getName() + ": " + quantity);
            } catch (InterruptedException e) {
                //4、run方法將無限期的運行,定期的向隊列中提交訂單,通過調(diào)用interrupt方法,這個線程可以被另外一個線程中斷。
                //   interrupt方法產(chǎn)生的InterruptException異常簡單的將shutdownRequest標志設(shè)置為true,將導(dǎo)致run方法無限循環(huán)終止
                shutdownRequest = true;
            }
        }
    }
}

/**
 *  買家
 *  Buyer類實現(xiàn)了Runnable接口并提供了以O(shè)rderQueue作為參數(shù)的構(gòu)造函數(shù)
 */
class Buyer implements Runnable{
    private BlockingQueue orderQueue;
    private boolean shutdownRequest = false;
    public Buyer(BlockingQueue orderQueue) {
        this.orderQueue = orderQueue;
    }
    @Override
    public void run() {
        while (shutdownRequest == false) {
            try {
                //1、run方法通過調(diào)用take方法,從隊列的頭部取出待辦的交易,
                //   如果隊列中沒有可用的訂單,take方法將阻塞,
                Integer quantity = ((Integer) orderQueue.take());
                //2、為了方便,打印訂單和線程的詳細信息
                System.out.println("Buy order by " + Thread.currentThread().getName() + ": " + quantity);
            } catch (InterruptedException e) {
                shutdownRequest = true;
            }
        }
    }
}
輸出
...
Buy order by Thread-134: 48
Buy order by Thread-134: 83
Buy order by Thread-134: 2
Buy order by Thread-134: 52
Sell order byThread-86: 90
Sell order byThread-86: 19
Sell order byThread-86: 64
Sell order byThread-86: 83
Sell order byThread-86: 27
Buy order by Thread-163: 94
Buy order by Thread-163: 74
...

當在鍵盤上按下Enter鍵使,程序終止

在這個程序中,如果沒有使用阻塞隊列,訪問非同步隊列中放置的交易時會發(fā)生競爭,每個人都會嘗試搶得低于當前市場價格出售的股票,多個交易者會選取統(tǒng)一訂單,交易之間會很混亂,由于阻塞隊列 確保了同步地訪問隊列,因此交易的完整性絕不會 受到損害。

在這個例子中使用了LinkedBlockingQueue,氣死也可以基于優(yōu)先級的隊列,這樣會自動按照交易的買價和賣價對交易進行排列,具有最好買價和最低賣價的訂單總是排在隊列的頭部。要使用基于優(yōu)先級的隊列,需要提供適當?shù)谋容^器。

說明

1、GitHub代碼歡迎star。你們輕輕的一點,對我鼓勵特大。

2、個人認為學習語言最好的方式就是模仿思考別人為什么這么寫。結(jié)合栗子效果更好,也能記住知識點。

3、只因為自己知識欠缺,語言組織能力不行,所以只能以這樣方式記錄。感覺效果很好。

4、本文基于《Java 7 編程高級進階》所寫,寫的非常不錯,建議大家去看看

文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請注明本文地址:http://specialneedsforspecialkids.com/yun/68509.html

相關(guān)文章

  • Python量化交易基礎(chǔ)講堂——管理概率==理性交易

    摘要:那么我們改變概率這個因子,將它放大到,我們邀請個人參與局看下效果看來結(jié)果還不錯,只要增加盈利的概率,就可以在市場中獲得收益,這就是量化交易的魅力管理概率理性交易。 在《Python實戰(zhàn)-構(gòu)建基于股票的量化交易系統(tǒng)》小冊子中,我們以股票為交易標的講解量化交易的學習,主要原因是股票的風險和收益介于期貨和基金之間。期貨一方面加了杠桿,另一方面走勢變化非常迅速,稍有不慎有可能血本無歸,這不太適...

    AWang 評論0 收藏0
  • 從理想到現(xiàn)實, 你不知道的區(qū)塊鏈

    摘要:簡而言之,區(qū)塊鏈說的是由區(qū)塊用某種方式組織起來的鏈條。在本文中,我們說的區(qū)塊鏈技術(shù)實際上是一種分布式數(shù)據(jù)庫技術(shù)。事實上,當使用基于區(qū)塊鏈的系統(tǒng)時,人們對中心機構(gòu)的信任轉(zhuǎn)而被對數(shù)學的信任所取代。因而,基于區(qū)塊鏈的系統(tǒng)是安全的。 區(qū)塊鏈是什么?我們來看一下區(qū)塊鏈在維基百科上被大家公認的官方定義: 一個區(qū)塊鏈是一個基于比特幣協(xié)議的不需要許可的分布式數(shù)據(jù)庫,它維護了一個持續(xù)增長的不可被篡改和修...

    seasonley 評論0 收藏0
  • 金融套利策略:理解統(tǒng)計套利的工作原理

    摘要:后一種方法被稱之為多因子統(tǒng)計套利模型。套利套利可以被稱為交叉資產(chǎn)套利的一種形式,它可以識別的價值與其相關(guān)資產(chǎn)之間的差異。目前,統(tǒng)計套利策略已經(jīng)成為了對沖基金和投資銀行的主要力量。 作者:chen_h微信號 & QQ:862251340微信公眾號:coderpai簡書地址:https://www.jianshu.com/p/ea2... 1. 什么是定量交易 定量交易是通過統(tǒng)計技術(shù)(或...

    whataa 評論0 收藏0
  • 說說股票配資系統(tǒng)中實盤交易接口的開發(fā)

    摘要:做股票配資系統(tǒng)難免會用到交易接口,好用的能用的接口也少。券商那邊也不提供,那索性自己開發(fā)股票配資實盤交易接口了。 做股票配資系統(tǒng)難免會用到交易接口,好用的能用的接口也少。券商那邊也不提供,那索性自己開發(fā)股票配資實盤交易接口了。經(jīng)過多次嘗試,總算搞出來了,實時交易接口可以獲取用戶數(shù)據(jù),實時對接,賬戶信息,委托買入賣出,支持多家券商。 種類4(可撤單)返回 {data1: { 委托類別:...

    leoperfect 評論0 收藏0

發(fā)表評論

0條評論

最新活動
閱讀需要支付1元查看
<