Java offbynull协程不使用所有 com.offbynull.coroutines 1.1.0版使用者仅使用7500条消息。

Java offbynull协程不使用所有 com.offbynull.coroutines 1.1.0版使用者仅使用7500条消息。,java,coroutine,java-threads,Java,Coroutine,Java Threads,请帮助我理解为什么此代码只使用7500消息,而不是30000 公共类DemoProducerConsumer{ 公共静态int cnt=0; 公共静态最终整数最大值=10000; 公共静态类生成器实现协同程序{ @凌驾 公共无效运行(延续ctn)引发异常{ 字符串thName=Thread.currentThread().getName(); System.out.println(thName+“)Producer start…); 消费者=新消费者(); 对于(int i=0;i

请帮助我理解为什么此代码只使用
7500
消息,而不是
30000


公共类DemoProducerConsumer{
公共静态int cnt=0;
公共静态最终整数最大值=10000;
公共静态类生成器实现协同程序{
@凌驾
公共无效运行(延续ctn)引发异常{
字符串thName=Thread.currentThread().getName();
System.out.println(thName+“)Producer start…);
消费者=新消费者();
对于(int i=0;i<3;i++){
consumer.consume(ctn,“Hello:+i”);
}
System.out.println(thName+”)制作人发布了3条消息);
}
}
公共静态类使用者{
公共无效消耗(连续ctn,字符串消息){
字符串thName=Thread.currentThread().getName();
System.out.println(thName+“”“+消息);

cnt++;//这里是协同程序的作者。您似乎误解了execute()方法的工作原理。每次调用suspend()时,execute()都将返回。当您再次调用execute()时,它将从您挂起的点继续执行该方法

因此,如果您想完全执行协同路由最大次数,则需要将主循环更改为以下内容:

for (int i = 0; i < MAX; i++) {
    boolean stillExecuting;
    do {
        stillExecuting = runner.execute();
    } while (stillExecuting);
}
使用上述更改运行将产生您期望的输出:

main) Producer Looped 10000 times.
main) Message consumed:30000
main) Exiting...

此外,您应该花一些时间评估协同程序是否适合您的用例。我不明白您试图解决的问题,但听起来普通的Java线程构造可能更适合您。

您好。感谢您的回复。我使用它来分析至少一个C10K web性能问题(从db和进程/应答模型请求/拉入)。与其他库(如Kilim和Reactor)相比,我理解协同程序应该在一个比多线程更平滑的环境中工作,有大量的线程上下文切换。上面的示例代码:生产者(MVC的控制器)和消费者(模型或DAO层)。不带套接字的本地调用仅用于测试示例代码。我还针对其他库分析协同路由,例如:
public static volatile int cnt = 0;
main) Producer Looped 10000 times.
main) Message consumed:30000
main) Exiting...