Java-协程

什么是协程

大多数的开发人员可能对进程,线程这两个名字比较熟悉。但是为了追求最大力度的发挥硬件的性能和提升软件的速度,出现了协程或者叫纤程(Fiber),或者绿色线程(GreenThread)。那我们来聊下什么是协程,以及在java中是怎么体现和运用协程的。


在说协程之前,我们先来回想下,现在大多数的程序中,都是使用了多线程技术来解决一些需要长时间阻塞的场景。JAVA中每个线程栈默认1024K,没有办法开成千上万个线程,而且就算通过JVM参数调小,CPU也无法分配时间片给每个线程,大多数的线程还是在等待中,所以我们一般会使用

Runtime.getRuntime().availableProcessors()来配置线程数的大小(或者会根据实际情况调整,就不展开讨论了),但是就算是我们开了新的线程,该线程也可能是在等待系统IO的返回或者网络IO的返回,而且线程的切换有着大量的开销。


为了解决上面说的问题,大家可能会想到回调。现在很多框架都是基于回调来解决那些耗时的操作。但层数嵌套多了反而会引起反人类的回调地狱,并且回调后就丢失原函数的上下文。其中的代表呢就比如说nodeJs。


终于可以来聊聊协程。它的基本原理是:在某个点挂起当前的任务,并且保存栈信息,去执行另一个任务;等完成或达到某个条件时,在还原原来的栈信息并继续执行。上面提到的几个点大家会想到JVM的结构,栈, 程序计数器等等,但是JVM原生是不支持这样的操作的(至少java是不支持的,kotlin是可以的)。因此如果要在纯java代码里需要使用协程的话需要引入第三方包,如kilim,Quasar。而kilim已经很久未更新了,那么我们来看看Quasar。

 

Quasar原理

1、利用字节码增强,将普通的java代码转换为支持协程的代码。
2、在调用pausable方法的时候,如果pause了就保存当前方法栈的State,停止执行当前协程,将控制权交给调度器
3、调度器负责调度就绪的协程
4、协程resume的时候,自动恢复State,根据协程的pc计数跳转到上次执行的位置,继续执行。

这些第三方的框架大部分实现是一致的。通过对字节码直接操作,在编译期把你写的代码变为支持协程的版本,并在运行时把你所有需要用到协程的部分由他来控制和调度,同时也支持在运行期这样做。
Quasar中使用了抛异常的方式来中断线程,但是 实际上如果我们捕获了这个异常就会产生问题,所以一般是以这种方式来注册:

   @Suspendable
public int f() {
 try {
   // do some stuff
   return g() * 2;
 } catch(SuspendExecution s) {
   //这里不应该捕获到异常.
   throw new AssertionError(s);
 }
}

在调度方面,Quasar中默认使用了JDK7以上才有的ForkJoinPool,它的优势就在于空闲的线程会去从其他线程任务队列尾部”偷取”任务来自己处理,因此也叫work-stealing功能。这个功能可以大大的利用CPU资源,不让线程白白空闲着。

 

Quasar模块

 

Fiber

Fiber可以认为是一个微线程,使用方式基本上和Thread相同,启动start:

   new Fiber<V>() {

 @Override

 protected V run() throws SuspendExecution, InterruptedException {

       // your code

   }

}.start();

new Fiber<Void>(new SuspendableRunnable() {

 public void run() throws SuspendExecution, InterruptedException {

   // your code

 }

}).start();  

 

其实它更类似于一个CallBack,是可以携带返回值的,并且可以抛异常SuspendExecution,InterruptedException。你也可以向其中传递SuspendableRunnable 或 SuspendableCallable 给Fiber的构造函数。你甚至可以像线程一样调用join(),或者get()来阻塞线程等待他完成。
当Fiber比较大的时候,Fiber可以在调用parkAndSerialize 方法时被序列化,在调用unparkSerialized时被反序列化。

从以上我们可以看出Fiber与Thread非常类似,极大的减少了迁移的成本。

 

FiberScheduler

FiberScheduler是Quasar框架中核心的任务调度器,负责管理任务的工作者线程WorkerThread

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值