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

}

我误解了纤维吗?

4

1 回答 1

0

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

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

有关将工具与 Quasar 集成的更多信息(通常很容易),请参见例如这篇博文

于 2016-08-11T06:44:25.980 回答