各种语言在实现Coroutine方式的支持时,多数都采用了Actor Model来实现,Actor Model简单来说就是每个任务就是一个Actor,Actor之间通过消息传递的方式来进行交互,而不采用共享的方式,Actor可以看做是一个轻量级的进程或线程,通常在一台4G内存的机器上,创建几十万个Actor是毫无问题的。

对于Java应用而言,传统方式下为了支持高并发,由于一个线程只能用于处理一个请求,即使是线程中其实有很多IO中断、锁等待也同样如此,因此通常的做法是通过启动很多的线程来支撑高并发,但当线程过多时,就造成了CPU需要消耗不少的时间在线程的切换上,从而出现瓶颈,按照上面对Coroutine的描述,Coroutine的方式理论上而言能够大幅度的提升Java应用所能支撑的并发量。

Kilim是由剑桥的两位博士开发的一个用于在Java中使用Coroutine的框架,Kilim基于Java语法,先来看看Kilim中的关键概念。

l  Task

可以认为Task就是Actor,使用方式和Java Thread基本相同,只是继承的为Task,覆盖的为execute方法,启动也是调用task的start方法。

l  Task的消息发送机制

Kilim中通过Mailbox对象来发送消息,Mailbox的基本原则为可以有多个消息发送者,但只能有一个消息接收者,发送的方式有同步发送、异步发送和阻塞线程方式的同步发送三种,同步发送是指保证一定能将消息放入发送队列中,如当前发送队列已满,则等待到可用为止,阻塞的为当前Task;异步发送则是尝试将消息放入发送队列一次,如失败,则返回false,成功则返回true,不会阻塞Task;阻塞线程方式的同步发送是指阻塞当前线程,并保证将消息发送给接收者,三种方式的使用方法如下:

mailbox.put(messageObject); // 同步发送

mailbox.putnb(messageObject); // 异步发送

mailbox.putb(messageObject); // 阻塞线程方式发送

l  Task的消息接收机制

Kilim中通过Mailbox来接收消息,接收消息的方式有同步接收、异步接收以及阻塞线程方式的同步接收三种,同步接收是指阻塞当前Task,直到接收到消息才返回;异步接收是指立刻返回Mailbox中的消息,有就返回,没有则返回null;阻塞线程方式的同步接收是指阻塞当前线程,直到接收到消息才返回,使用方法如下:

mailbox.get(); // 同步接收,传入long参数表示等待的超时时间,单位为毫秒

mailbox.getnb(); // 异步接收,立刻返回

mailbox.getb(); // 阻塞线程方式接收

在实际Java应用中使用Coroutine时,通常会出现以下几种典型的更复杂的使用场景,由于Actor模式本身就是异步的,因此其天然对异步场景支持的就非常好。

在Kilim中要实现Task之间的同步调用非常简单,代码如下:

public class TaskA extends Task{

public void execute() throws Pausable,Exception{

Mailbox result=new Mailbox();

Task task=new TaskB(result);

task.start();

Object resultObject=result.get();

System.out.println(resultObject);

}

}

public class TaskB extends Task{

private Mailbox result;

public TaskB(Mailbox result){

this.result=result;

}

public void execute() throws Pausable,Exception{

result.put(“result from TaskB”);

}

}Kilim的Mailbox.get并不会阻塞线程,因此这种方式是完全满足需求的。

java协程_在Java中使用协程(Coroutine)相关推荐

  1. java实现鼠标宏编程_我應該如何編程高級java遊戲中的鼠標/鍵輸入?

    我是一名自學成才的程序員,所以我不知道正確的做事方式.我製作了諸如小行星和蛇之類的簡單遊戲,但在這些遊戲中,您可以輕鬆修改鍵事件功能中的變量.這裏是我在我的簡單的小行星遊戲做到了:我應該如何編程高級j ...

  2. java coin介绍_代码示例中的Java 7:Project Coin

    java coin介绍 该博客通过代码示例介绍了一些新的Java 7功能,这些项目在Project Coin一词下进行了概述. Project Coin的目标是向JDK 7添加一组小的语言更改.这些更 ...

  3. java final 类_在Java中,final修饰的类有什么特点

    展开全部 关于Java中的32313133353236313431303231363533e4b893e5b19e31333264663736final(2010-09-09 14:19:48)转载▼ ...

  4. java logging包_用JDK中提供的java.util.logging.*包创建Logger对象----原创

    由于项目中用到了Applet与Servlet之间(客户端用Applet.Server端用Servlet)的通信,要求: 1:>客户端与服务端必须出Log. 2:>浏览器在加载Applet时 ...

  5. java jar 目录_将Java类路径中的所有jar包括在一个目录中

    有没有一种方法可以将所有的jar文件包含在类路径的目录中? 我正在尝试java -classpath lib / *.jar :. my.package.Program,它无法找到当然在这些罐子里的类 ...

  6. java gradle构建_在Gradle中为JPMS构建Java 6-8库

    java gradle构建 通过提供Java 9 module-info.class了解如何使用Gradle构建支持JPMS( Java平台模块系统 )的Java 6-8库. 介绍 如果您需要JPMS ...

  7. java避免空指针异常_避免Java中的空指针异常

    java避免空指针异常 空指针异常是Java中最常见,最烦人的异常. 在这篇文章中,我想避免这种不希望的异常. 首先让我们创建引发空指针异常的示例 private Boolean isFinished ...

  8. ubuntu java classpath 设置_在Ubuntu中正确设置java classpath和java_home

    我有错误 Exception in thread"main" java.lang.NoClassDefFoundError: 当我尝试在Ubuntu上运行编译类时.我使用的是一个非 ...

  9. java字符串数组排序_在Java中对字符串数组进行排序

    允许用户使用字符串数组.他们可以向数组添加字符串,从数组中删除字符串,搜索数组中的字符串,最终他们将能够对数组进行排序.分类是搞砸我的原因.我尝试过几种不同的方法.第一种方法是将数组转换为ArrayL ...

  10. java 异常对象_在java中的异常处理中的异常对象是什么

    展开全部 Exception类以及他的子类 的一个实例对象 比如32313133353236313431303231363533e58685e5aeb931333264633563 常见异常 1. j ...

最新文章

  1. 语音合成(文字转语音)工具大全
  2. php mysql 登录注销_laravel 实现用户登录注销并限制功能
  3. 子矩阵(NOIP2014 普及组第四题)
  4. getline没有与参数列表匹配的重载函数_C++新增基础功能解析—函数重载功能的使用...
  5. fscanf返回值被忽略怎么解决_pytest的fixture怎么用?
  6. 分布式存储 CentOS6.5虚拟机环境搭建FastDFS-5.0.5集群
  7. jsp 中实现点击按钮 实现页面跳转到HTML
  8. PAT 1089 狼人杀-简单版(20 分)- 乙级
  9. mysql explode函数_hive中,lateral view 与 explode函数
  10. 北京最最最牛逼的 IT 公司全在这了!
  11. HP常用函数总结(一):
  12. 今日头条技术架构分析
  13. STM32F103系列之移植uCOS-II
  14. Sqlserver取整
  15. 2020春季学期哈工大软件构造学习心得一
  16. 【20180904】【查漏补缺】量纲分析法—Pi定理(Buckingham定理)
  17. SSD,NCC,Lucas-Kanade模板匹配,目标跟踪
  18. CCF CSP认证 202009-4 星际旅行
  19. 使用 robot_pose_ekf 对imu和odom进行融合
  20. 022-企业站:纽曼移动端微官网实战

热门文章

  1. 使用Pageoffice打开Office word报错0x80040154问题或者卸除WPS后Microsoft Office图标无法显示问题
  2. win10分屏设置一边竖屏_win10两个显示器横屏和竖屏拓展
  3. app微信登陆 小程序微信授权登陆
  4. python中调用adb命令来控制手机
  5. 【考研数学】高等数学知识点整理——第一章 函数、极限、连续
  6. android studio 导入module作为lib使用
  7. typeScript的定义类型:不能将类型“Timeout”分配给类型“number”;
  8. 头脑王者_头脑令人困惑
  9. SpringBoot 项目中在Controller 直接调用Mapper,提示:Field mapper in ‘*Controller ‘ required a bean of type ‘*Map
  10. 局域网唤醒计算机,电脑远程开机_局域网唤醒电脑 | 茶杯猫