Java 开发 2.0: Kilim 简介

Python和Java免费对接KIMI助手(月之暗面) 阅读详情

对于软件开发人员而言,调试多线程应用程序中的非确定缺陷是最痛苦的工作。因此,像大多数人一样,我钟爱使用 Erlang 和 Scala 等函数语言进行并发编程。

Scala 和 Erlang 都采用了角色模型来进行并发编程,没有采用线程概念。围绕角色模型的创新并不仅限于语言本身,角色模型也可供 Kilim 等基于 Java 的角色框架使用。

Kilim 对角色模型的使用非常直观,稍后您将看到,该库使构建并发应用程序变得异常简单。

多核挑战

在 2005 年,Herb Sutter 编写了一篇现在仍然颇为著名的文章 “The Free Lunch is Over: A Fundamental Turn Toward Concurrency in Software”。在这篇文章中,他摒弃了一直误导着人们的观念,那就是摩尔定律将继续促进越来越高的 CPU 时钟速率。

Sutter 预言了 “免费午餐” 的终结,通过越来越快的芯片来捎带提升软件应用程序的性能将不再可能。相反,他认为应用程序性能的显著提升将需要利用多核芯片架构来实现。

事实证明他是对的。芯片制造商已经达到了一种硬性限制,芯片速率已稳定在 3.5 GHz 左右多年了。随着制造商越来越快地增加芯片上的核心数量,摩尔定律在多核领域继续得以满足。

关于本系列

自 Java 技术首次诞生以来,Java 开发格局已发生了翻天覆地的变化。得益于成熟的开源框架和可靠的租赁部署基础设施,现在可以迅速而经济地组装、测试、运行和维护 Java 应用程序。在本 系列 中,Andrew Glover 探索使这种新的 Java 开发风格成为可能的各种技术和工具。

Sutter 还提到并发编程将使开发人员能够利用多核架构。但是,他补充道,“相比如今的各种语言提供的编程模型,我们亟需一种更高级的并发编程模型。”

Java 等语言的基本编程模型是基于线程的。尽管多线程应用程序并不是很难编写,但正确 编写它们仍然面临许多挑战。并发编程的一个困难之处是利用线程来考虑并发性。如今已有许多并发模型,一种特别有趣并获得了 Java 社区认可的模型就是角色模型。

角色模型

角色模型是一种不同的并发进程建模方式。与通过共享内存与锁交互的线程不同,角色模型利用了 “角色” 概念,使用邮箱来传递异步消息。在这里,邮箱 类似于实际生活中的邮箱,消息可以存储并供其他角色检索,以便处理。邮箱有效地将各个进程彼此分开,而不用共享内存中的变量。

角色充当着独立且完全不同的实体,不会共享内存来进行通信。实际上,角色仅能通过邮箱通信。角色模型中没有锁和同步块,所以不会出现由它们引发的问题,比如死锁、严重的丢失更新问题。而且,角色能够并发工作,而不是采用某种顺序方式。因此,角色更加安全(不需要锁和同步),角色模型本身能够处理协调问题。在本质上,角色模型使并发编程更加简单了。

角色模型并不是一个新概念,它已经存在很长时间了。一些语言(比如 Erlang 和 Scala)的并发模型就是基于角色的,而不是基于线程。实际上,Erlang 在企业环境中的成功(Erlang 由 Ericsson 创建,在电信领域有着悠久的历史)无疑使角色模型变得更加流行,曝光率更高,而且这也使它成为了其他语言的一种可行的选择。Erlang 是角色模型更安全的并发编程方法的一个杰出示例。

不幸的是,角色模型并没有植入到 Java 平台中,但我们可以通过各种方式使用它。JVM 对替代语言的开放性意味着您可以通过 Java 平台语言(比如 Scala 或 Groovy)来利用角色(参见 参考资料,了解 Groovy 的角色库 GPars)。另外,您可以试用一种支持角色模型且基于 Java 的库,比如 Kilim。

Kilim 中的角色

Kilim 是一个使用 Java 编写的库,融入了角色模型的概念。在 Kilim 中,“角色” 是使用 Kilim 的 Task 类型来表示的。Task 是轻量型的线程,它们通过 Kilim 的 Mailbox 类型与其他 Task 通信。

Mailbox 可以接受任何类型的 “消息”。例如,Mailbox 类型接受 java.lang.Object。Task 可以发送 String 消息或者甚至自定义的消息类型,这完全取决于您自己。

在 Kilim 中,所有实体都通过方法签名捆绑在一起,如果您需要同时执行几项操作,可以在一个方法中指定该行为,扩大该方法的签名以抛出 Pausable。因此,在 Kilim 中创建并发类就像在 Java 中实现 Runnable 或扩展 Thread 一样简单。只是使用 Runnable 或 Thread 的附加实体(比如关键字 synchronized)更少了。

最后,Kilim 的魔力是由一个称为 weaver 的后期进程来实现的,该进程转换类的字节码。包含 Pausable throws 字句的方法在运行时由一个调度程序处理,该调度程序包含在 Kilim 库中。该调度程序处理有限数量的内核线程。可以利用此工具来处理更多的轻量型线程,这可以最大限度地提高上下文切换和启动的速度。每个线程的堆栈都是自动管理的。

在本质上,Kilim 使创建并发进程变得轻松而简单:只需从 Kilim 的 Task 类型进行扩展并实现 execute 方法。编译新创建的支持并发性的类之后,对其运行 Kilim 的 weaver,您会实现显著的性能提升!

Kilim 最初是一种外来语言,但它带来了巨大的回报。角色模型(以及后来的 Kilim)使编写依赖于类似对象的异步操作对象变得更加简单和安全。您可以 使用 Java 的基本线程模型进行同样的操作(比如扩展 Thread),但这更具挑战性,因为它会将您带回锁和同步的世界中。简而言之,将您的并发编程模型转换为角色使多线程应用程序更容易编码。

Kilim 实战

在 Kilim 的角色模型中,消息通过 Mailbox 在进程之间传送。在许多情况下,您可以将 Mailbox 看作队列。进程可以将一些项加入邮箱中,也可以从邮箱获取一些项,而且它们既可以采用阻塞方式,也可以采用非阻塞方式来这样做(阻塞对象是底层 Kilim 实现的轻量型进程,而不是内核线程)。

作为在 Kilim 中利用邮箱的一个示例,我编写了两个角色(Calculator 和 DeferredDivision),它们从 Kilim 的 Task 类型扩展而来。这些类将以一种并发方式协同工作。DeferredDivision 对象将创建一个被除数和一个除数,但它不会尝试将这两个数相除。我们知道除法运算很耗资源,所以 DeferredDivision 对象将要求 Calculator 类型来处理该任务。

这两个角色通过一个共享 Mailbox 实例通信,该实例接受一个 Calculation 类型。这种消息类型非常简单 —— 已提供了被除数和除数,Calculator 随后将执行计算并设定相应的答案。Calculator 然后将这个 Calculation 实例放回共享 Mailbox 中。

Calculation

清单 1 给出了这个简单的 Calculation 类型。您会注意到这个类型不需要任何特殊的 Kilim 代码。实际上,它只是一个再普通不过的 Java bean。


清单 1. 一个 Calculation 类型的消息
				
import java.math.BigDecimal;

public class Calculation {
 private BigDecimal dividend;
 private BigDecimal divisor;
 private BigDecimal answer;

 public Calculation(BigDecimal dividend, BigDecimal divisor) {
  super();
  this.dividend = dividend;
  this.divisor = divisor;
 }

 public BigDecimal getDividend() {
  return dividend;
 }

 public BigDecimal getDivisor() {
  return divisor;
 }

 public void setAnswer(BigDecimal ans){
  this.answer = ans;
 }

 public BigDecimal getAnswer(){
  return answer;
 }

 public String printAnswer() {
  return "The answer of " + dividend + " divided by " + divisor +
    " is " + answer;	
 }
}

DeferredDivision

DeferredDivision 类中使用了特定于 Kilim 的类。该类执行多项操作,但总体来讲它的工作非常简单:使用随机数(类型为 BigDecimal)创建 Calculation 的实例,将它们发送到 Calculator 角色。而且,该类还会检查共享的 MailBox,以查看其中是否有任何 Calculation。如果检索到的一个 Calculation 实例有一个答案,DeferredDivision 将打印它。


清单 2. DeferredDivision 创建随机除数和被除数
				
import java.math.BigDecimal;
import java.math.MathContext;
import java.util.Date;
import java.util.Random;

import kilim.Mailbox;
import kilim.Pausable;
import kilim.Task;

public class DeferredDivision extends Task {

 private Mailbox<Calculation> mailbox;

 public DeferredDivision(Mailbox<Calculation> mailbox) {
  super();
  this.mailbox = mailbox;
 }

 @Override
 public void execute() throws Pausable, Exception {
  Random numberGenerator = new Random(new Date().getTime());
  MathContext context = new MathContext(8);
  while (true) {
   System.out.println("I need to know the answer of something");
   mailbox.putnb(new Calculation(
     new BigDecimal(numberGenerator.nextDouble(), context), 
     new BigDecimal(numberGenerator.nextDouble(), context)));
   Task.sleep(1000);
   Calculation answer = mailbox.getnb(); // no block
   if (answer != null && answer.getAnswer() != null) {
    System.out.println("Answer is: " + answer.printAnswer());
   }
  }
 }
}

从清单 2 可以看到,DeferredDivision 类扩展了 Kilim 的 Task 类型,后者实际上模仿了角色模型。注意,该类还改写了 Task 的 execute 方法,后者默认情况下抛出 Pausable。因此,execute 的操作将在 Kilim 的调度程序控制下进行。也就是说,Kilim 将确保 execute 以一种安全的方式并行地运行。

在 execute 方法内部,DeferredDivision 创建 Calculation 的实例并将它们放在 Mailbox 中。它使用 putnb 方法以一种非阻塞方式完成此任务。

填充 mailbox 后,DeferredDivision 进入休眠状态 —— 注意,与处于休眠状态的内核线程不同,它是由 Kilim 托管的轻量型线程。当角色唤醒之后,像前面提到的一样,它在 mailbox 中查找任何 Calculation。此调用也是非阻塞的,这意味着 getnb 可以返回 null。如果 DeferredDivision 找到一个 Calculation 实例,并且该实例的 getAnswer 方法有一个值(也就是说,不是一个已由 Calculator 类型处理过的 Calculation 实例),它将该值打印到控制台。

Calculator

Mailbox 的另一端是 Calculator。与清单 2 中定义的 DeferredDivision 角色类似,Calculator 也扩展了 Kilim 的 Task 并实现了 execute 方法。一定要注意两个角色都共享同一个 Mailbox 实例。它们不能与不同的 Mailbox 通信,它们需要共享一个实例。相应地,两个角色都通过它们的构造函数接受一个有类型 Mailbox。


清单 3. 最终的实际运算角色:Calculator
				
import java.math.RoundingMode;

import kilim.Mailbox;
import kilim.Pausable;
import kilim.Task;

public class Calculator extends Task{

 private Mailbox<Calculation> mailbox;

 public Calculator(Mailbox<Calculation> mailbox) {
  super();
  this.mailbox = mailbox;
 }

 @Override
 public void execute() throws Pausable, Exception {
  while (true) {			
   Calculation calc = mailbox.get(); // blocks
   if (calc.getAnswer() == null) {
    calc.setAnswer(calc.getDividend().divide(calc.getDivisor(), 8, 
      RoundingMode.HALF_UP));				
    System.out.println("Calculator determined answer");
    mailbox.putnb(calc);
   }
   Task.sleep(1000);
  }
 }
}

Calculator 的 execute 方法与 DeferredDivision 的相应方法一样,不断循环查找共享 Mailbox 中的项。区别在于 Calculator 调用 get 方法,这是一种阻塞调用。相应地,当一条 Calculation “消息” 显示时,它执行请求的除法运算。最后,Calculator 将修改的 Calculation 放回到 Mailbox 中(采用非阻塞方式),然后进入休眠状态。两个角色中的休眠调用都仅用于简化控制台的读取。

Kilim 的 weaver

在前面,我提到了 Kilim 通过其 weaver 执行字节码操作。这是一个简单的后处理过程,您在编译了类之后 运行它。weaver 然后将一些特殊代码添加到包含 Pausable 标记的各种类和方法中。

调用 weaver 非常简单。举例而言,在清单 4 中,我使用 Ant 调用 Weaver。我需要做的只是告诉 Weaver 我需要的类在哪里,以及在哪里放置生成的字节码。在这个例子中,我让 Weaver 更改 target/classes 字典中的类,并将生成的字节码写回到该字典。


清单 4. Ant 调用 Kilim 的 weaver
				
<target name="weave" depends="compile" description="handles Kilim byte code weaving">
 <java classname="kilim.tools.Weaver" fork="yes">
  <classpath refid="classpath" />
  <arg value="-d" />
  <arg value="./target/classes" />
  <arg line="./target/classes" />
 </java>
</target>

更改代码之后,我就可以在运行时随意利用 Kilim 了,只要我在类路径中包含了它的 .jar 文件。

在运行时使用 Kilim

将这两个角色应用到实际中就像在 Java 代码中应用两个普通的 Thread 一样。您使用同一个共享 sharedMailbox 实例创建并扩展两个角色实例,然后调用 start 方法来实际设置它们。


清单 5. 一个简单的程序
				
import kilim.Mailbox;
import kilim.Task;

public class CalculationCooperation {
 public static void main(String[] args) {
  Mailbox<Calculation> sharedMailbox = new Mailbox<Calculation>();

  Task deferred = new DeferredDivision(sharedMailbox);
  Task calculator = new Calculator(sharedMailbox);

  deffered.start();
  calculator.start();

 }
}

运行这两个角色会得到如清单 6 所示的输出。如果运行此代码,您的输出可能有所不同,但活动的逻辑顺序将保持不变。在清单 6 中,DeferredDivision 请求计算,Calculator 使用一个答案作为响应。


清单 6. 您的输出将有所不同 —— 各个角色不是一成不变的
				
[java] I need to know the answer of something
[java] Calculator determined answer
[java] Answer is: The answer of 0.36477377 divided by 0.96829189 is 0.37671881
[java] I need to know the answer of something
[java] Calculator determined answer
[java] Answer is: The answer of 0.40326269 divided by 0.38055487 is 1.05967029
[java] I need to know the answer of something
[java] Calculator determined answer
[java] Answer is: The answer of 0.16258913 divided by 0.91854403 is 0.17700744
[java] I need to know the answer of something
[java] Calculator determined answer
[java] Answer is: The answer of 0.77380722 divided by 0.49075363 is 1.57677330

结束语

角色模型支持采用一种更安全的机制来在进程(或角色)之间进行消息传递,极大地方便了并发编程。此模型的实现因语言和框架的不同而不同。我建议参考 Erlang 的角色,其次是 Scala 的角色。两种实现都很简洁,都具有各自的语法。

如果您想要利用 “plain Jane” Java 角色,那么您最好的选择可能是 Kilim 或一种类似框架(参见 参考资料)。世上没有免费的午餐,但基于角色的框架确实使并发编程以及利用多核进程变得更加简单。

java实现kimi接口对接 要使用 Java 实现 Kimi 接口对接,这里假设 Kimi 指的是字节跳动的 Kimi 大模型,以下是一个基本的对接示例,其主要步骤包括:1. 注册并获取 API 密钥在使用 Kimi 接口之前,你需要在相应的平台上注册并获取 API 密钥,通常会有 API Key 和 Secret Key ,用于身份验证。2. 添加... 阅读详情

相关推荐

JAVA:Spring Boot 集成 Kilim 协程实践

本文介绍了如何在Spring Boot项目中集成Kilim协程框架来构建高并发应用。Kilim通过字节码增强实现轻量级协程,支持无阻塞I/O和消息传递,单线程可管理数十万协程,大幅降低线程切换开销。文章详细展示了配置步骤、异步任务实现、服务集成以及Mailbox通信的代码示例,并列举了Kilim在高并发API、微服务通信等场景的应用优势。该框架为Java开发者提供了一种比传统线程更高效的并发编程方案,特别适合需要处理海量并发的现代分布式系统。

木头 1496

java调用kimi,完成智能对话

java调用kimi的api,完成智能会话

QQ903275718的博客 3459

国密证书实战:在CentOS 7上构建GmSSL私有CA与完整证书链

本文详细介绍了在CentOS 7操作系统上,使用GmSSL工具构建私有国密证书颁发机构(CA)与完整证书链的实战指南。内容涵盖从部署GmSSL、创建国密根CA、签发服务器与客户端证书,到生产环境安全加固与最佳实践的全流程,旨在帮助系统管理员和安全工程师建立统一、可控的内部国密安全通信体系。

jenkins8butler的博客 496

java对接kimi详细说明,附完整项目

需求:使用java封装kimi接口为http接口,并把调用kimi时的传参和返回数据,保存到mysql数据库中自己记录一下,以做备忘。

一火的专栏 4276

NXP S32K5 MCU如何赋能Zonal架构与软件定义汽车?

汽车电子架构正从分布式ECU向域集中、再向Zonal分区架构演进,核心驱动力在于线束简化、算力下沉与软件分层解耦。区域控制器作为物理区域的“调度员”,需要同时满足实时响应、功能安全、多网络协议转换和OTA升级等要求,这使MCU与SoC的选型成为系统工程的关键决策。MCU凭借确定性的微秒级启动、低功耗、丰富的IO控制以及成熟的ASIL-D认证路径,仍是区域控制器的主流选择。NXP S32K5正是面向这一场景发布的系列MCU:它集成多核锁步、CAN-XL、TSN以太网、硬件安全模块与双Bank Flash,补齐

weixin_28721917的博客 356

【LTspice】005 伯德图绘制

目录 1 伯德图介绍 2 LTspice 截止频率验证 3 LTspice中如何添加光标 4 LTspice中如何将 幅频 和 相频曲线分开 1 伯德图介绍 Bode图由对数幅频特性和对数相频特性两张图组成。伯德图_百度百科 (1)对数幅频特性曲线 对数幅频特性是频率特性的对数值L(ω)=20lgA (ω)(dB)与频率ω的关系曲线;对数幅频特性的纵轴采用线性分度,为幅值的分贝数,即 L(ω)=20lgA(ω),A(ω)每增加10倍,L(ω)增加20dB;横坐标采用对数分度,即横轴上的ω取

m0_59642765的博客 1万+

java调用kimi大模型聊天接口

一个kimi大模型api的调用工具,传入一个apiKey即可对kimi聊天。

weixin_48811255的博客 3467

axi时序图_(AXI)握手协议(pvld/prdy或者valid-ready)中ready打拍技巧

内容提要ready打拍的问题用FIFO的思路去解决用Buffer的思路去解决问题提出:ready时序如何优化?在valid/ready 握手协议中,valid 与 data的时序优化比较容易理解,(不熟悉valid/ready协议或者valid打拍方法的)大家可以参考上次推送(握手协议(pvld/prdy或者valid-ready或AXI)中Valid及data打拍技巧)。 但是有时候,关键路径是...

weixin_29763641的博客 3323

java kilim_Java开发2.0,Kilim简介

存档日期:2019年5月13日 | 首次发布:2010年4月13日 并发编程是Java™Development 2.0的核心,但可能不是基于线程的并发。 安德鲁·格洛弗(Andrew Glover)解释了为何参与者在多核系统中的并发编程中胜过线程。 然后,他介绍了Kilim,这是一个基于actor的消息传递框架,将并行编程和分布式编程结合在一起。 此内容不再被更新或维护。 全文以PDF...

cusi77914的博客 496

使用openMVS对样例数据进行重建

openMVS根据github上的步骤进行编译。注意,如果没有GPU,用不了CUDA的话,那么需要在openMVS目录下找到CmakeLists.txt文件,把CUDA设置为OFF: SET(OpenMVS_USE_CUDA OFF CACHE BOOL "Enable CUDA library") 可执行的文件生成在openMVS_build/bin/里面,在openMVS_build文件夹下打开终端,按照顺序执行如下命令即可逐步重建。其中,-w 设置的是数据的总路径,-i 后接输入的文件名,-o

YuhsiHu的博客 2886

低功耗模式下的看门狗使用

最近用国产芯片AT32在做一个低功耗的项目,为了实现低功耗模式下的定时唤醒,我选择的是使用相对比较简单的看门狗来做,下面就分享一下使用过程~ 为了最大限度的降低功耗,我用的是待机模式,先看看几种低功耗模式以及唤醒的区别: 而看门狗AT32提供了两种,分别是独立看门狗(IWDG)和窗口看门狗(WWDG),其区别大概有以下几点: 1、独立看门狗(IWDG)由专用的低速时钟(LSI)驱动,即使主时钟发生故障它也仍然有效;窗口看门狗由从 APB1 时钟分频后得到的时钟驱动,通过可配置的时间窗口来检测应用程序非正常

dc18883988396的博客 3028

kilim Hello world

本文主要介绍kilim的相关资源以及以Hello world为例,介绍kilim如何编译运行。 下载源码 kilim 1.0:https://github.com/kilim/kilim kilim 2.0:https://github.com/nqzero/kilim 工程里包含了基础的运行方式、源码、例子以及相关文档等资源。如果在使用中遇到什么问题或者bug,都可以给作者提issu...

just_record的博客 734

2020年信奥赛C++提高组csp-s初赛真题及答案解析(阅读程序第3题)

2020年信奥赛C++提高组csp-s初赛真题及答案解析(阅读程序第3题)

王老师青少年编程 990

Java并发编程:Kilim协程框架

Kilim是一个专为Java设计的轻量级协程框架,它通过字节码操纵技术实现了轻量级的协程,为Java开发者提供了更为灵活的并发编程选项。

玉汝于成 1043

基于NARX和NARX-LSTM的模型辨识与MPC控制系统调试与优化

本文针对两输入单输出非线性系统,提出基于NARX和NARX-LSTM的模型辨识与MPC控制优化方案。系统输入为固定量u1和可调量u2(8.5-140),输出目标为-0.58。现有模型存在辨识精度不足、历史输出依赖过重、预测偏差等问题。解决方案包括:数据差分处理改善非平稳性、调整延迟阶数优化模型结构、引入注意力机制替代手动加权、改进损失函数消除预测偏差。MPC控制器将结合优化模型,考虑控制变量步长约束(≥2),实现输出稳定控制。通过系统性的模型调试与控制算法优化,最终形成完整的非线性系统辨识与控制框架。

huanghm88的专栏 128

蓝牙模块HM-10手册

蓝牙模块HM-10手册,该手册对蓝牙模块HM-10进行了详细的介绍和使用方法以及一些AT指令。

Java协程框架Kilim特性分析和总结

简介 Github地址 kilim 1.0:https://github.com/kilim/kilim kilim 2.0:https://github.com/nqzero/kilim 特性 1.Kilim是一个Java消息传递框架,它提供了超轻量级的线程和工具,可以在这些线程之间进行快速、安全、零复制的消息传递。 2.Kilim的核心在于Mailbox跨线程共享内存,没有锁或同...

FeelTouch Labs 2396

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

java携程kilim_【JAVA新生】kilim版的协程

试用了一下 http://docs.paralleluniverse.co/quasar/,发现它是基于JDK 1.7的(主要是fork join pool)。于是拿kilim的代码改了一个纯协程的版本出来。kilim的原始版本(https://github.com/kilim/kilim)里所有的Task都与一个Scheduler绑定,而且官方的例子里都是讲怎么使用Mailbox做messagi...

weixin_33236595的博客 378

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

霍尼韦尔SoftMaster使用说明

霍尼韦尔SoftMaster使用说明

java携程kilim,Java协程框架–Kilim源码分析 | 学步园

Kilim 是一个用于在Java 协程框架,Kilim协程框架的结构图如下:1. Task可以认为Task 就是Actor,使用方式和Java Thread 基本相同,只是继承的为Task,覆盖的为execute 方法,启动也是调用task 的start 方法。public Task start() {if (scheduler == null) {setScheduler(Scheduler.g...

weixin_36484814的博客 389

ClawHub UI Proof Runtime:基于 Crabbox 的远程全栈 UI 验证体系解析

> 导读:`specs/ui-proof.md` 定义了 ClawHub 的远程 `proof:ui` 验证运行时——一种从源码和全新本地数据出发、不触碰任何共享或生产后端的全栈 UI 证明机制。本文结合 [scripts/ui-proof.mjs](https://link.gitcode.com/i/0946321b5a966f55a61dfc2359ddda7c)、[scripts/ui-p

gitblog_00231的博客 845

java并发(三十四)协程kilim

概述  对协程的技术已经觊觎很久,他有高性能的优点,但目前工具对他支持的不是很好,调试繁琐。苦于运维和调试比较困难,一直望而却步。恰逢十一,决心攻下这块碉堡。这边文章只是个引子,后续会做更详细的描述,不断完善。贴出实践的经验。  Java里成熟一点的框架属kilim,这个发音让我想起了俄罗斯的克林姆林宫。  顺便欣赏下美景吧。  确实豪华!  进程,线程,协程。简单理

dotedy的博客 898

Java协程框架--Kilim源码分析

Kilim 是一个用于在Java 中使用协程的框架,Kilim 中的关键概念,Kilim 框架图如下: 1. Task 可以认为Task 就是Actor,使用方式和Java Thread 基本相同,只是继承的为Task,覆盖的为execute 方法,启动也是调用task 的start 方法。 public Task start() { if (sche

kobejayandy的专栏 7695
上一篇: 分布式系统协调 ZooKeeper
下一篇: 系统设计之粒度控制
kobejayandy
博客等级 码龄18年 2853粉丝 43原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值