文档章节

Java Async IO Library: Quasar (use Channel)

OrangeJoke
 OrangeJoke
发布于 2016/09/25 13:44
字数 585
阅读 266
收藏 2

前言

你如果熟悉go ,fiber (对于fiber可以简单理解成为轻量级线程)和 channel 就对应go 的goroutines 和channel,在go语言中用法如下:

package main

import "fmt"

func sum(s []int, c chan int) {   //方法执行体
	sum := 0
	for _, v := range s {
		sum += v
	}
	c <- sum // send sum to c
}

func main() {                      //main 函数
	s := []int{7, 2, 8, -9, 4, 0}     // 构建一个数组

	c := make(chan int)    //新建一个channel
	go sum(s[:len(s)/2], c)  // 新起一个协程,然后在协程中执行方法,相当于new 一个fiber
	go sum(s[len(s)/2:], c)  // new 一个fiber 。。
	x, y := <-c, <-c // receive from c    // 通过channel来传递消息

	fmt.Println(x, y, x+y)
}

fiber example:

Channel<Object> objectChannel = Channels.newChannel(0);  // 0 ,receive() block until send() complete
new Fiber<Void>((SuspendableRunnable) () -> {
            // your code
            objectChannel.send()

        }).inheritThreadLocals().start();

// 简化成java8 functional://todo

什么是channel

channel 用于提供不同fiber之间的交互,保证同一时间只有一个fiber能访问到值。

channel 最主要的两个方法send() and receive(),send() 会阻塞直到结果完成,receive()会阻塞直至send()操作完成。(也正是因为阻塞,所以和fiber(轻量)配合得很好)

BufferChannel ,new channel 的时候指定大小,buffer满的时候会阻塞。

why not use fiber.get()? throw null pointer exception, (how about strand?)

quasar 的fiber提供个get()方法,但在实际交互过程中会存在@suspendable 忘了的情况(交互多的时候比较复杂)

为什么要使用channel

Instead of explicitly using locks to mediate access to shared data, Go encourages the use of channels to pass references to data between goroutines. This approach ensures that only one goroutine has access to the data at a given time. The concept is summarized in the document Effective Go (a must-read for any Go programmer): Do not communicate by sharing memory; instead, share memory by communicating.

比起传统的通过加锁的方式访问变量,fiber通过消息传递的方式来共享变量

channel 更像是queue,通过这种方式来共享消息,这种编程方式的原理的话参考这篇论文CSP

总结

fiber 和channel构建起来的编程模型,简单理解就是,起一个协程(轻量级线程),它们之间的交互通过channel来传递消息。

参考:

share memory by communicate code walk

share memory by communicate blog

effective go

© 著作权归作者所有

共有 人打赏支持
OrangeJoke
粉丝 37
博文 51
码字总数 34565
作品 0
江北
高级程序员
私信 提问
老外写的关于协程的性能文章-主打http协议

https://dzone.com/articles/high-concurrency-http-clients-on-the-jvm HTTP is probably the most popular application-level protocol and there are many libraries that implement it o......

强子1985
2016/11/23
0
0
Quasar/Pulsar 0.7.0 发布,支持 Kotlin M12!

Quasar/Pulsar 0.7.0 发布,此版本包括大量的新特性和改进:初步支持 Kotlin M12,还有一个 Kotlin Actors API 预览;改进 Clojure 自动化;升级 实现(v0.1.346.0);额外的 Java 8-specific ...

oschina
2015/05/30
679
0
次时代Java编程(一):Java里的协程

什么是协程(coroutine) 这东西其实有很多名词,比如有的人喜欢称为纤程(Fiber),或者绿色线程(GreenThread)。其实最直观的解释可以定义为线程的线程。有点拗口,但本质上就是这样。 我们先回...

力谱宿云
2016/05/25
2.3K
0
Quasar 0.7.4 发布,Java 轻量级线程库

Quasar 是一个 Java 库,提供了高性能、轻量级的线程,类似 Go 语言的 Channel,Erlang 语言的 Actor 和其他异步编程工具。 Quasar 0.7.4 发布,此版本更新内容如下: Suspendable and 下载页...

oschina
2016/01/20
3K
5
Quasar 0.7.3 发布,Java 轻量级线程库

Quasar 是一个 Java 库,提供了高性能、轻量级的线程,类似 Go 语言的 Channel,Erlang 语言的 Actor 和其他异步编程工具。 Quasar 0.7.3 发布,此版本更新内容如下: 重大改进 Kotlin's fun...

oschina
2015/09/13
1K
2

没有更多内容

加载失败,请刷新页面

加载更多

AWS的自动部署工具codedeploy 部署前的准备工作

开始部署codedeploy: 1.先预置IAM用户: 创建一个IAM用户或使用一个与AWS相关联的用户; 复制以下的策略附加到IAM用户,向IAM用户赋予对codedeploy(及codedeploy所依赖的AWS服务和操作)的...

守护-创造
23分钟前
0
0
这可能是最详细的一线大厂Mysql面试题详解了

1、MySQL的复制原理以及流程 基本原理流程,3个线程以及之间的关联; 主:binlog线程——记录下所有改变了数据库数据的语句,放进master上的binlog中; 从:io线程——在使用start slave 之后...

Java干货分享
33分钟前
1
0
人的精力是什么?如何强化精力

人的精力是什么? 人的精力是什么? 精力指精神和体力。精神包括一个人的精神状态,兴奋度,做事情的投入度,专注度,持续时间等。 人的精力来源 人的精力有4种来源,身体的、情感的、思想的和...

莫库什勒
52分钟前
1
0
JFinal开发的旅游线路营销Saas平台演示系统我部署了一个

今天部署了一个旅游线路营销管理系统的演示版: 演示地址:http://lvyou.jfinalxueyuan.com 演示账号:(暂时只给一个门店版的吧,批发商和总部的如果需要 演示看看 单独联系我微信:1876673...

山东-小木
今天
2
0
如何学习大数据技术

学习大数据技术,首先要明确大数据的概念。 大数据的概念作者认为有如下几点: 1.数据的来源多样性。例如关系数据库+文本+excel等 2.数据量大。TB级别的数据。 3.业务应用领域。实时性高与实...

董黎明
今天
3
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部