当运行的光纤被阻挡时,线程是否可以运行另一根光纤

时间:2016-07-27 07:56:50

标签: fiber quasar

据我所知,当运行的光纤被阻挡时,一个线程可以运行另一条光纤。但事实并非如此。我创建了100根光纤,它将搜索solr。我发现所有光纤都是在order.Another光纤只有在前一个光纤就像一个线程完成时才能执行。这是我的代码。

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;
    }

}

我误解了纤维吗?

1 个答案:

答案 0 :(得分:0)

光纤只有在执行光纤阻塞调用时才会执行其他非阻塞光纤,而不是线程阻塞调用,而Quasar不会自动转换线程 - 阻止对光纤阻塞的调用,因此您需要为不了解Quasar的现有工具编写(通常很小的)集成。

Quasar提供的并发编程库(类似Go的通道,类似Erlang的actor,数据流编程,反应流和java.util.concurrent端口)支持光纤阻塞(从光纤调用时)和线程阻塞(从线程调用时);对于涵盖许多工具的Comsat集成也是如此,但截至今天,并非Solr。您是自己构建了Solr集成还是只solrService.search()线程阻塞?

有关使用Quasar集成工具的更多信息(通常非常简单),请参阅this blog post