Java并发 -- 协程

栏目: Java · 发布时间: 7年前

  1. 协程可以理解为一种 轻量级的线程
  2. 从操作系统的角度来看,线程是在 内核态 中调度的,而 协程 是在 用户态 调度的,协程的切换成本更低
  3. 协程栈比线程栈要小得多,典型的线程栈在1M左右,而协程栈一般在几K或者几十K左右
  4. 因此无论在时间维度还是在空间维度,协程都比线程轻量很多
  5. 支持协程的语言:Go、 PythonLua 、Kotlin
    • Java OpenSDK的Loom项目的目标是为了支持协程

Go中的协程

func hello(msg string) {
    fmt.Println("Hello " + msg)
}

func TestCoroutine(t *testing.T) {
    // 在新的协程中执行hello方法
    go hello("Go")
    // 等待100毫秒让协程执行结束
    time.Sleep(100 * time.Millisecond)
}
  1. Java中的线程是一个重量级对象,因此无法很好地实现Thread-Per-Message模式,而协程可以
  2. Thread-Per-Message模式非常简单,模式越简单,功能就越稳定,可理解性也越好

echo程序

import (
    "log"
    "net"
)

// 使用Thread-Per-Message模式,为每个成功建立连接的Socket分配一个协程
// 相对于 Java 线程池的实现方案,Go协程的方案更简单
func main() {
    // 监听本地9090端口
    socket, err := net.Listen("tcp", "127.0.0.1:9090")
    if err != nil {
    	log.Panicln(err)
    }
    defer socket.Close()
    for {
    	// 处理连接请求
    	conn, err := socket.Accept()
    	if err != nil {
            log.Panicln(err)
    	}
    	// 处理已经成功连接的请求
    	go handleRqeust(conn)
    }
}

// 处理已经成功连接的请求
func handleRqeust(conn net.Conn) {
    defer conn.Close()
    for {
    	buf := make([]byte, 1024)
    	// 读取请求数据
    	size, err := conn.Read(buf)
    	if err != nil {
            return
    	}
    	// 回写读取到的数据
    	_, _ = conn.Write(buf[:size])
    }
}

以上就是本文的全部内容,希望本文的内容对大家的学习或者工作能带来一定的帮助,也希望大家多多支持 码农网

查看所有标签

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

深入理解Java虚拟机(第2版)

深入理解Java虚拟机(第2版)

周志明 / 机械工业出版社 / 2013-9-1 / 79.00元

《深入理解Java虚拟机:JVM高级特性与最佳实践(第2版)》内容简介:第1版两年内印刷近10次,4家网上书店的评论近4?000条,98%以上的评论全部为5星级的好评,是整个Java图书领域公认的经典著作和超级畅销书,繁体版在台湾也十分受欢迎。第2版在第1版的基础上做了很大的改进:根据最新的JDK 1.7对全书内容进行了全面的升级和补充;增加了大量处理各种常见JVM问题的技巧和最佳实践;增加了若干......一起来看看 《深入理解Java虚拟机(第2版)》 这本书的介绍吧!

JSON 在线解析
JSON 在线解析

在线 JSON 格式化工具

XML 在线格式化
XML 在线格式化

在线 XML 格式化压缩工具

RGB CMYK 转换工具
RGB CMYK 转换工具

RGB CMYK 互转工具