go 通道(channel),go 线程间通信
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 线程间通信相关推荐
- Net线程间通信的异步机制
线程间通信 我们看下面的图 图1 我们来看线程间通信的原理:线程(Thread B)和线程(Thread A)通信, 首先线程A 必须实现同步上下文对象(Synchronization Context ...
- NIO详解(十一):线程间通信管道Pipe
1. 概述 Java NIO 管道是2个线程之间的单向数据连接.Pipe有一个source通道和一个sink通道.数据会被写到sink通道,从source通道读取.下面是Pipe原理的图示: 当有两个 ...
- Java并发——线程间通信与同步技术
传统的线程间通信与同步技术为Object上的wait().notify().notifyAll()等方法,Java在显示锁上增加了Condition对象,该对象也可以实现线程间通信与同步.本文会介绍有 ...
- Java基础学习——多线程(线程间通信-生产者消费者代码示例)
JDK 1.5提供了多线程升级方案 将同步synchronized替换成了显示的Lock操作.可以实现唤醒.冻结指定的线程. Lock接口 Lock 实现提供了比使用 synchronized 方法和 ...
- 【转】Java里如何实现线程间通信
正常情况下,每个子线程完成各自的任务就可以结束了.不过有的时候,我们希望多个线程协同工作来完成某个任务,这时就涉及到了线程间通信了. 本文涉及到的知识点:thread.join(), object.w ...
- 【Java 并发编程】线程简介 ( 进程与线程 | 并发概念 | 线程间通信 | Java 并发 3 特性 )
文章目录 一.进程与线程 二.并发 三.线程间通信 四.Java 并发 3 特性 一.进程与线程 最开始是没有线程这个概念的 , 一个应用程序就是一个进程 , 应用程序运行时 , 如果还要处理与用户交 ...
- java线程通信概念_java基础线程总结(线程概念、线程创建方式、线程间通信、线程重要方法)...
基础篇之<线程> @author :kern ---------------------------------------------------------------- 一:进程:是 ...
- 线程间通信的三种方法 (转)
http://www.cnblogs.com/puxidun/archive/2009/12/06/1618142.html 线程间通信的三种方法 多线程通信的方法主要有以下三种: 1.全局变量 进 ...
- Java 如何线程间通信,面试被问哭。。。
Java 如何线程间通信,曾经小编面试被问哭的一道题.. 正常情况下,每个子线程完成各自的任务就可以结束了.不过有的时候,我们希望多个线程协同工作来完成某个任务,这时就涉及到了线程间通信了. 本文涉及 ...
- 【JUC并发编程03】线程间通信
文章目录 3 线程间通信 3.1 synchronized 实现案例 3.2 虚假唤醒问题 3.3 Lock 实现案例 3 线程间通信 线程间通信有两种实现方法: 关键字 synchronized 与 ...
最新文章
- 优质机器学习方面文章
- (021)java后台开发之HttpServletRequest
- 正负值地处理以及添加回调函数小案例
- Nacos如何支撑阿里内部数十万服务注册压力?
- python文档字符串格式_Python字符串及文本模式方法详解
- leetcode python3 简单题206. Reverse Linked List
- 值得推荐的WEB版报表工具-报表设计器
- 登陆系统的设计1 - 设计用户数据表
- 【渝粤教育】国家开放大学2018年春季 0704-22T民法基础与实务 参考试题
- GalleryView禁止选中项目向中间滑动
- EtherCAT总线伺服速度控制功能块(H5U PLC)
- 74LS138设计一位二进制全减器
- 核磁共振电子计算机断层扫描术,计算机断层扫描(CT)和核磁共振(MRI) 的区别...
- 毕业设计开题报告撰写方法
- 【转】立方体的体对角线穿过多少个正方体?
- calcite解读专栏前言
- 如何在GraphPad Prism 里创建条形图?
- JavaScript系列之详解原型和原型链
- 数据库学习之MySQL (九)—— 数学函数 字符串函数 CONCAT TRIM PAD
- 论文解读--Automatic Portrait Segmentation for Image Stylization