go 通道(channel)是用来传递数据的一个数据结构。

通道可用于两个 goroutine 之间通过传递一个指定类型的值来同步运行和通讯。操作符 <- 用于指定通道的方向,发送或接收。
package mainimport ("fmt""time"
)var c1 = make(chan string)func input1() {i := 0for {time.Sleep(time.Second)i++// 发送数据c1 <- "out1"fmt.Println("in:out1")c1 <- "out2"fmt.Println("in:out2")}
}func output1() {for {// 阻塞监听数据x := <-c1time.Sleep(time.Second)fmt.Println("get:", x)}
}func main() {go output1()go input1()for {time.Sleep(time.Minute)}
}

结果:

API server listening at: 127.0.0.1:37394
in:out1
get: out1
in:out2
get: out2
in:out1
get: out1
in:out2
get: out2
in:out1
get: out1
in:out2
get: out2

通过程序发现 发送端发送数据,同时必须有接收端相应的接收数据

然后有带缓冲区 通道 c1 := make(chan string, 10)

package mainimport ("fmt""time"
)
//改了这里
var c1 = make(chan string, 10)func input1() {i := 0for {time.Sleep(time.Second)i++// 发送数据c1 <- "out1"fmt.Println("in:out1")c1 <- "out2"fmt.Println("in:out2")}
}func output1() {for {// 阻塞监听数据x := <-c1time.Sleep(time.Second)fmt.Println("get:", x)}
}func main() {go output1()go input1()for {time.Sleep(time.Minute)}
}

结果:

API server listening at: 127.0.0.1:22705
in:out1
in:out2
in:out1
in:out2
get: out1
get: out2
in:out1
in:out2
in:out1
in:out2
get: out1
get: out2
in:out1
in:out2
in:out1
in:out2
get: out1
in:out1
in:out2
get: out2
get: out1

结论:

  • 带缓冲区使用像队列一样
  • 数据发送和接收端的数据获取处于异步状态
  • 缓冲区的大小是有限制的,缓冲区一满,数据发送端就发送数据

go 通道(channel),go 线程间通信相关推荐

  1. Net线程间通信的异步机制

    线程间通信 我们看下面的图 图1 我们来看线程间通信的原理:线程(Thread B)和线程(Thread A)通信, 首先线程A 必须实现同步上下文对象(Synchronization Context ...

  2. NIO详解(十一):线程间通信管道Pipe

    1. 概述 Java NIO 管道是2个线程之间的单向数据连接.Pipe有一个source通道和一个sink通道.数据会被写到sink通道,从source通道读取.下面是Pipe原理的图示: 当有两个 ...

  3. Java并发——线程间通信与同步技术

    传统的线程间通信与同步技术为Object上的wait().notify().notifyAll()等方法,Java在显示锁上增加了Condition对象,该对象也可以实现线程间通信与同步.本文会介绍有 ...

  4. Java基础学习——多线程(线程间通信-生产者消费者代码示例)

    JDK 1.5提供了多线程升级方案 将同步synchronized替换成了显示的Lock操作.可以实现唤醒.冻结指定的线程. Lock接口 Lock 实现提供了比使用 synchronized 方法和 ...

  5. 【转】Java里如何实现线程间通信

    正常情况下,每个子线程完成各自的任务就可以结束了.不过有的时候,我们希望多个线程协同工作来完成某个任务,这时就涉及到了线程间通信了. 本文涉及到的知识点:thread.join(), object.w ...

  6. 【Java 并发编程】线程简介 ( 进程与线程 | 并发概念 | 线程间通信 | Java 并发 3 特性 )

    文章目录 一.进程与线程 二.并发 三.线程间通信 四.Java 并发 3 特性 一.进程与线程 最开始是没有线程这个概念的 , 一个应用程序就是一个进程 , 应用程序运行时 , 如果还要处理与用户交 ...

  7. java线程通信概念_java基础线程总结(线程概念、线程创建方式、线程间通信、线程重要方法)...

    基础篇之<线程> @author :kern ---------------------------------------------------------------- 一:进程:是 ...

  8. 线程间通信的三种方法 (转)

    http://www.cnblogs.com/puxidun/archive/2009/12/06/1618142.html 线程间通信的三种方法 多线程通信的方法主要有以下三种:  1.全局变量 进 ...

  9. Java 如何线程间通信,面试被问哭。。。

    Java 如何线程间通信,曾经小编面试被问哭的一道题.. 正常情况下,每个子线程完成各自的任务就可以结束了.不过有的时候,我们希望多个线程协同工作来完成某个任务,这时就涉及到了线程间通信了. 本文涉及 ...

  10. 【JUC并发编程03】线程间通信

    文章目录 3 线程间通信 3.1 synchronized 实现案例 3.2 虚假唤醒问题 3.3 Lock 实现案例 3 线程间通信 线程间通信有两种实现方法: 关键字 synchronized 与 ...

最新文章

  1. 优质机器学习方面文章
  2. (021)java后台开发之HttpServletRequest
  3. 正负值地处理以及添加回调函数小案例
  4. Nacos如何支撑阿里内部数十万服务注册压力?
  5. python文档字符串格式_Python字符串及文本模式方法详解
  6. leetcode python3 简单题206. Reverse Linked List
  7. 值得推荐的WEB版报表工具-报表设计器
  8. 登陆系统的设计1 - 设计用户数据表
  9. 【渝粤教育】国家开放大学2018年春季 0704-22T民法基础与实务 参考试题
  10. GalleryView禁止选中项目向中间滑动
  11. EtherCAT总线伺服速度控制功能块(H5U PLC)
  12. 74LS138设计一位二进制全减器
  13. 核磁共振电子计算机断层扫描术,计算机断层扫描(CT)和核磁共振(MRI) 的区别...
  14. 毕业设计开题报告撰写方法
  15. 【转】立方体的体对角线穿过多少个正方体?
  16. calcite解读专栏前言
  17. 如何在GraphPad Prism 里创建条形图?
  18. JavaScript系列之详解原型和原型链
  19. 数据库学习之MySQL (九)—— 数学函数 字符串函数 CONCAT TRIM PAD
  20. 论文解读--Automatic Portrait Segmentation for Image Stylization

热门文章

  1. 如何加声调口诀_标声调口诀
  2. QQ截图无法截取右键菜单等内容解决方案
  3. 如何批量打开一组网页?
  4. HTB-Escape
  5. 将Roaring Bitmap序列化为JSON
  6. 你与优秀的UI设计师差距在哪里
  7. 软件在环SIL和硬件在环PIL实现过程记录
  8. 【行研报告】2021中国康复医疗行业研究报告—附下载
  9. “智能、微型、多功能”将引领智能手表传感器新趋势
  10. 摆钟刚到美洲时“水土不服”,但后来它促成了物理学革命