Может ли поток запускать другое волокно, когда работающее волокно заблокировано?

Насколько я вижу, поток может запускать другое волокно, когда работающее волокно заблокировано. Но это не так. Я создаю 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;
    }

}

Я неправильно понял волокно?


person happy programmer    schedule 27.07.2016    source источник


Ответы (1)


Волокна передают выполнение другим неблокированным волокнам только тогда, когда они выполняют вызовы блокировки волокна, а не вызовы блокировки потока, и Quasar не преобразует автоматически вызовы блокировки потока в блокирующие волокна, поэтому вам нужно написать (обычно небольшие) интеграции для уже существующих инструментов, которые не знают о Quasar.

Библиотеки параллельного программирования, предоставляемые Quasar (Go-подобные каналы, Erlang-подобные акторы, программирование потоков данных, реактивные потоки и порт java.util.concurrent), поддерживают как блокировку волокон (при вызове из волокон), так и блокировку потоков (при вызове из потоков); то же самое верно для интеграций Comsat, которые охватывают многие инструменты, но на сегодняшний день не Solr. Вы сами создали интеграцию с Solr или solrService.search() блокирует только потоки?

Для получения дополнительной информации об интеграции инструментов с Quasar (обычно это довольно просто) см., например, эту запись в блоге. .

person circlespainter    schedule 11.08.2016