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

Kilim 是一个用于在Java 协程框架,Kilim协程框架的结构图如下:

c1f9bea7d600e6e63d1368985be99c43.png

1. Task

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

public Task start() {

if (scheduler == null) {

setScheduler(Scheduler.getDefaultScheduler());

}

resume();

return this;

}

2. Scheduler

Scheduler是Kilim框架中核心的任务调度器,负责管理任务的工作者线程WorkerThread,以及一个基本的FIFO队列,维护着Task任务列表,Scheduler负责分派Task给指定的工作者线程WorkerThread执行,类似于ExecutorService线程池管理Runnable和Callable任务的执行。

public LinkedList allThreads = new LinkedList();

public RingQueue waitingThreads = new RingQueue(10);

protected volatile boolean shutdown = false;

public RingQueue runnableTasks = new RingQueue(100);

工作者线程WorkerThread的默认初始化个数为Runtime.getRuntime().availableProcessors(),且所有空闲的线程会添加到RingQueue队列中

3. WorkerThread

WorkerThread是执行任务Task的具体线程,内部维护一个默认大小为10的环形队列RingQueue,与ThreadPoolExecutor线程池中定义的Worker类似,循环阻塞式的从任务队列中获取下一个任务执行。

RingQueue tasks = new RingQueue(10);

public void run() {

try {

while (true) {

Task t = getNextTask(this); // blocks until task available

runningTask = t;

t._runExecute(this);

runningTask = null;

}

} catch (ShutdownException se) {

// nothing to do.

} catch (OutOfMemoryError ex) {

System.err.println("Out of memory");

} catch (Throwable ex) {

ex.printStackTrace();

}

runningTask = null;

}

4. RingQueue

RingQueue本质上即一个环形队列,作为Queue用于不同的线程之间传递message的设计,和ZeroMQ利用ringbuffer来作为pipe在不同线程之间传递message的用法都是很类似的。

public class RingQueue {

protected T[] elements;

protected int iprod; // producer index

protected int icons; // consumer index;

protected int maxSize;

protected int size;

}

5. Mailbox

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

public class Mailbox implements PauseReason, EventPublisher {

T[] msgs;

private int iprod = 0; // producer index

private int icons = 0; // consumer index;

private int numMsgs = 0;

private int maxMsgs = 300;

EventSubscriber sink; }

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

public T get() throws Pausable{

Task t = Task.getCurrentTask();

T msg = get(t);

while (msg == null) {

Task.pause(this);

removeMsgAvailableListener(t);

msg = get(t);

}

return msg;

}

6. EventPublisher和EventSubscriber

public interface EventPublisher {

}

public interface EventSubscriber {

void onEvent(EventPublisher ep, Event e);

}

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值