据我所知,当正在运行的光纤被阻塞时,线程可以运行另一个光纤。但事实并非如此。我创建了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;
}
}
我误解纤维了吗?
只有当其他未阻塞的光纤执行光纤阻塞调用,而不是线程阻塞调用时,光纤才会执行其他未阻塞光纤,并且Quasar不会自动将线程阻塞调用转换为光纤阻塞调用,因此您需要为不了解Quasar的预先存在的工具编写(通常是小型)集成。
Quasar提供的并发编程库(类Go通道、类Erlang参与者、数据流编程、反应流和java.util.concurrent
端口)支持光纤阻塞(从光纤调用时)和线程阻塞(从线程调用时);Comsat集成也是如此,它涵盖了许多工具,但到目前为止,还没有Solr。您是自己构建了Solr集成,还是solrService.search()
只是线程阻塞?
有关将工具与Quasar集成的更多信息(通常很容易),请参阅本文。