go是用于创建协徎/线程的,go中没有线程一说
chan是用于做阻塞操作的
通过它可以实现子线程结束以后才能主线程结束,类似于java中的join关键字
创建:
go func(){
xxx
}
阻塞:
go func(ch chan int){
xxx
ch<-1
}
//结束掉阻塞
<-ch
【golang|golang创建多线程,以及限制等待函数执行后主进程才结束(示例:监听两个端口的程序)】示例:
//web服务器
package main
import (
"fmt"
"log"
//"net"
"net/http"
//"net/rpc/jsonrpc"
//"os"
//"encoding/json"
//"bufio"
//"time"
//"bytes"
//"encoding/hex"
//"errors"
//seelog "github.com/cihub/seelog"
"html"
"strconv"
)
func main (){
/*s := &http.Server{
Addr:":8080",
Handler:myHandler,
ReadTimeout:10 * time.Second,
WriteTimeout:10 * time.Second,
MaxHeaderBytes: 1 << 20,
}*/
//
http.HandleFunc("/", func(w http.ResponseWriter, r *http.Request) {
log.Println("请求的参数是",r.URL.String())
fmt.Fprintf(w, "Hello, %q", html.EscapeString(r.URL.Path))
r.ParseForm()
log.Println("请求的参数是",r.Form)
log.Println("请求的参数id是",r.FormValue("id"))})
ch1,ch2:=make(chan int),make(chan int)
go web(8001,ch1)
go web(8002,ch2)
log.Println("end...")
//<-ch1
//<-ch2
//如果没有取出的操作,就会导致这个携程结束
<-ch1
<-ch2
}
func web(i int,ch chan int){
log.Println(i)
http.ListenAndServe(":"+strconv.Itoa(i), nil)
//log.Fatal()
//这里需要注意的就是这个阻塞操作,要放到函数的最后,这样才能让函数里面的代码执行
ch<-i}
推荐阅读
- Java|Java基础——数组
- 人工智能|干货!人体姿态估计与运动预测
- java简介|Java是什么(Java能用来干什么?)
- Java|规范的打印日志
- Linux|109 个实用 shell 脚本
- 程序员|【高级Java架构师系统学习】毕业一年萌新的Java大厂面经,最新整理
- Spring注解驱动第十讲--@Autowired使用
- SqlServer|sql server的UPDLOCK、HOLDLOCK试验
- jvm|【JVM】JVM08(java内存模型解析[JMM])
- 技术|为参加2021年蓝桥杯Java软件开发大学B组细心整理常见基础知识、搜索和常用算法解析例题(持续更新...)