簡體   English   中英

期貨是否在單個線程上執行? (斯卡拉)

[英]Are Futures executed on a single thread? (Scala)

使用Scala中的默認隱式執行上下文,是否會在單個專用線程上計算每個新的未來,還是將計算划分並分發到線程池中的多個線程?

我不知道這是否有幫助,這個問題的背景是我想使用HtmlUnit API執行多個並發操作。 為此,我將每個新的WebClient實例包裝在Future中。 唯一的問題是WebClient類不是線程安全的,所以我擔心它可能會被分解並發送到不同的線程。

一個未來在一個線程上執行。 可能會在多個線程上執行幾個期貨。 因此,不超過一個未來可以同時占用一個線程。

它是如何工作的? 當您創建Future時,它意味着您已將任務提交到您的線程池 - 這個任務不能被隱式並行化,因此它只在一個線程上執行。 提交到池的一個或多個任務被放入池的隊列中,因此執行器逐個從該隊列中獲取任務,並在一些隨機(或有意)選擇的線程上運行每個任務。 所以幾個期貨可能會涉及多個線程。

關於共享對象 - 對於期貨之間共享的對象安全執行操作的唯一方法是使用Executors.newFixedThreadPool(1) ,它將只使用整個池的一個線程。 另一個解決方案 - 是為每個未來克隆這樣的對象。 使用actor(使您的共享對象成為actor的狀態)應該是最佳選擇。

如果你每個未來都使用一個對象 - 一切都應該沒問題。

注意:未來的處理程序,如Future{ ... }.map(handler)可以在與未來本身不同的線程中執行,但它實際上創建了另一個Future來獲取結果。 flatMap 更確切地說,他們使用onComplete來創建CallbackRunnable以在舊的未來成功之后啟動處理程序(可能在不同的線程中) - 這個回調剛剛完成了新創建的未來,所以仍然“每個未來不超過一個線程”

Future[+T]不能保證如果它由多個期貨組成,它將在同一個線程上完成。 也就是說,這並不意味着你會得到一個並發修改異常或類似的東西。 你仍然可以獲得順序執行的異步代碼,在這種情況下它是安全的。

至於你的第二個問題,只要你有一個每個未來的實例,你不應該有任何並發​​問題。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM