2016-07-27 164 views
0

據我所知,當光纖被阻塞時,線程可以運行另一條光纖。但事實並非如此。我創建了100條光纖,它們將搜索solr。我發現的結果是所有的光纖都按順序執行。只有當前一個光纖完成時,另一個光纖才能執行,就像一個線程。這是我的代碼。當運行中的光纖被阻塞時,線程是否可以運行另一條光纖

import co.paralleluniverse.fibers.Fiber; 
import co.paralleluniverse.fibers.FiberForkJoinScheduler; 
import co.paralleluniverse.fibers.FiberScheduler; 
import co.paralleluniverse.fibers.SuspendExecution; 

public class FilterThreadTest { 
    static FiberForkJoinScheduler fiberForkJoinScheduler = new FiberForkJoinScheduler("fork-join-schedule", 1); 
    static SolrService solrService = new SolrService(); 

    public static void main(String[] args) { 
     solrService.init(); 
     for (int i = 0; i < 100; i++) { 
      new CountFiber(fiberForkJoinScheduler, i, solrService).start(); 
     } 
     try { 
      Thread.sleep(10000000); 
     } catch (InterruptedException e) { 
      // TODO Auto-generated catch block 
      e.printStackTrace(); 
     } 
    } 

} 

class CountFiber extends Fiber<Void> { 

    /** 
    * 
    */ 
    private static final long serialVersionUID = 1L; 
    private int count; 
    private SolrService solrService; 

    public CountFiber(FiberScheduler scheduler, int count, SolrService  solrService) { 
     super(scheduler); 
     // TODO Auto-generated constructor stub 
     this.count = count; 
     this.solrService = solrService; 
    } 

    @Override 
    public Void run() throws SuspendExecution, InterruptedException { 
     System.out.println(count + " fiber is starting!"); 
     solrService.search(); 
     System.out.println(count + " fiber is ended!"); 
     return null; 
    } 

} 

我誤解了纖維?

回答

0

纖維將產生執行到其他未封端的纖維時,才執行纖維粘連呼叫,不線程阻塞一和類星體不自動變換線程阻塞調用成纖維粘連那些所以你需要爲不知道Quasar的預先存在的工具編寫(通常很小的)集成。 Quasar提供的併發編程庫(Go-like通道,Erlang類操作符,數據流編程,反應流和端口)支持光纖阻塞(從光纖中調用時)和線程阻塞(當調用來自線程);對於Comsat集成來說也是如此,它涵蓋了許多工具,但到目前爲止,並非Solr。您是否自己構建Solr集成,或者只有線程阻塞的solrService.search()

有關將工具與Quasar集成(通常非常簡單)的更多信息,請參閱例如this blog post