golang主线程让子线程退出的三种方式(代码片段)

老虎中的小白Gentle 老虎中的小白Gentle     2022-12-19     341

关键词:

在golang中,主go程告知子go程退出有三种方式,建议用后面两种

方式一:全局变量方式

package main

import (
	"fmt"
	"sync"
	"time"
)
var wg sync.WaitGroup
var exit bool  //零值为false
//方式1全局变量
func mode1() 
	fmt.Println("come in mode1()")
	defer fmt.Println("out of mode1")
	defer wg.Done() //计数器-1

	for 
		time.Sleep(time.Second *1)
		fmt.Println("mode1 say hello go")
		if exit  //主go程,将exit赋值为true时,跳出循环,结束程序
			break
		
	



func main() 

	fmt.Println("come in main()")
	defer  fmt.Println("out of main()")
	wg.Add(1) //计数器+1
	go mode1()  //开始跑协程
	time.Sleep(time.Second*5) //睡眠5s
	exit = true //当exit=true, 子go程就跳出循环结束
	wg.Wait()  //主线程等待所有子线程结束,等待计数器为0


方式二:channel方式

package main

import (
	"fmt"
	"sync"
	"time"
)

var wg sync.WaitGroup

//关于参数传递
//1.chan struct 类型空间小 比 chan bool 一字节小,也许是0?
//2.应该(可以)传入exitChan <- chan struct,代表只能从channel中接收,不能发送
//额外: chan <- struct 只能发送,不能接收
func mode2(exitChan  chan struct) 
	fmt.Println("come in mode2()")
	defer fmt.Println("out of mode2()")
LOOP:
	for 
		select 
		case <- exitChan: //可以从channel中取出值
			//break //单纯的break 只是跳出select
			break LOOP //break 标签 的作用,跳出for循环,标签定义要在前面
		default:
			fmt.Println("mode2 say hello go")
			time.Sleep(time.Second*1)
		
	



func main() 
	fmt.Println("come in main()")
	defer fmt.Println("out of main()")
	var exitChan = make(chan struct) //这里定义了不带缓存的channel,你也可以定义带缓存的channel
	wg.Add(1)
	go mode2(exitChan)
	time.Sleep(time.Second*5)
	exitChan <- struct //向channel中写数据
	close(exitChan)//关闭channel
	wg.Wait()


方式三:Context方式

Go1.7加入了一个新的标准库context。
本质也是channel,传入的也是chan struct类型的。

使用全局变量在跨包调用时不容易实现规范和统一,需要维护一个共用的channe。所以官方就提出了一个规范,Context方式的出现l。

package main

import (
	"context"
	"fmt"
	"sync"
	"time"
)

var wg sync.WaitGroup

func mode3(ctx context.Context) 
	fmt.Println("come in mode3()")
	defer fmt.Println("out of mode3")
	defer wg.Done() //计数器-1
	LOOP:
		for 
			fmt.Println("mode3 say hello go")
			time.Sleep(time.Second*1)
			select 
			case <-ctx.Done(): //等待通知
				break LOOP //跳出for循环
			default:

			
		


func main() 

	fmt.Println("come in main()")
	defer fmt.Println("out of main()")
	ctx, cancel :=context.WithCancel(context.Background())
	wg.Add(1) //计数器+1
	go mode3(ctx) //跑go线程
	time.Sleep(time.Second*5)
	cancel() //通知子线程goroutine结束
	wg.Wait() //等待计数器置为0



golang主线程让子线程退出的三种方式(代码片段)

在golang中,主go程告知子go程退出有三种方式,建议用后面两种方式一:全局变量方式packagemainimport( "fmt" "sync" "time")varwgsync.WaitGroupvarexitbool//零值为false//方式1全局变量funcmode1() fmt.Println("comeinmode1()&... 查看详情

java多线程实现的三种方式(代码片段)

文章目录实现多线程方式一:继承Thread类方法介绍实现步骤代码演示思考问题实现多线程方式二:实现Runnable接口Thread构造方法实现步骤代码演示实现多线程方式三:实现Callable接口方法介绍实现步骤代码演示三种实现方式... 查看详情

大数据必学java基础(七十六):创建线程的三种方式(代码片段)

文章目录创建线程的三种方式一、继承Thread类二、实现Runnable接口三、实现Callable接口创建线程的三种方式一、继承Thread类在学习多线程之前,以前的代码是单线程的吗?不是,以前也是有三个线程同时执行的。现在... 查看详情

并发编程(壹):创建线程的三种方式及其对比(代码片段)

创建线程的三种方式及其对比1.继承Thread类(1).继承Thread类。并重写run()方法,该方法无参数,无返回值;(2).创建子类实例,并实例化对象;(3).通过start()方法启动,注意:不是通过run()方法启动。publicclassThreadDemoextendsThreadpublicvoid... 查看详情

多线程基础二(线程的启动终止,线程面临的三种问题)(代码片段)

一、线程的启动、终止方式  启动: startnative(调用外部接口启动)   终止:  stop(类似kill,暴力终止) interrupt中断的方式通过指令的方式volatilebooleanstop=false;publicclassInterruptDemoprivatestaticinti;publicstat 查看详情

线程的三种实现方法(代码片段)

线程的三种实现方法:(1)继承Thread类,重写run()方法;(2)实现Runnable接口,重写run()方法;(3)实现Callable接口,重写call()方法;方式一: 继承Thread类publicclassMyThreadDemopublicstaticvoidmain(String[]args)Threadthread=newMyThread();thread.... 查看详情

使用tpl取回task中的运行结果的三种方式(代码片段)

...:TPL(Task ParallelLibrary)任务并行库使用Task类执行多线程操作要比直接使用自己手工创建Thread效率高很多。默认情况下,TPL使用线程池中的线程执行Task,但是工作结束之后,调用者线程怎么取回执行线程的工作结果呢?这里... 查看详情

java多线程《ii》—启动线程的三种方式和源码分析(代码片段)

...家见面啦,总算挑出点时间写文章了,写一下多线程吧,后面还会继续更新,文章内容若有问题请指出,万分感谢!好啦,下面就开始今天的课程吧!1、继承Th 查看详情

java——多线程高并发系列之创建多线程的三种方式(threadrunnablecallable)(代码片段)

...)方法)写在前面历时一个星期,终于整完了Java多线程高并发这个系 查看详情

java创建线程的三种方式,同步锁的实现synchronized,lock(代码片段)

一、继承Thread类创建通过继承Thread并且重写其run()方法,通过调用start()方法即可执行线程方法。写法1:publicclassMyThreadextendsThread@Overridepublicvoidrun()for(inti=0;i<15;i++)System.out.println(getName()& 查看详情

线程的三种创建方式你get了吗?(代码片段)

备战2022春招或暑期实习,祝大家每天进步亿点点!Java并发编程Day4本篇总结的是如何在Java中避免创建不必要的对象,后续会每日更新~关于《我们一起学Redis》、《我们一起学HarmonyOS》等知识点可以查看我的往期博客... 查看详情

49多线程创建的三种方式之继承thread类(代码片段)

继承Thread类创建线程在java里面,开发者可以创建线程,这样在程序执行过程中,如果CPU空闲了,就会执行线程中的内容。使用Thread创建线程的步骤:1.自定义一个类,继承java.lang包下的Thread类2.重写run方法3.将要在线程中执行的... 查看详情

线程间通信常用的三种方法

多线程通信的方法主要有以下三种: 1.全局变量进程中的线程间内存共享,这是比较常用的通信方式和交互方式。注:定义全局变量时最好使用volatile来定义,以防编译器对此变量进行优化。2.Message消息机制常用的Message通信... 查看详情

java终止线程的三种方式(代码片段)

Java终止线程的方式停止一个线程通常意味着在线程处理任务完成之前停掉正在做的操作,也就是放弃当前的操作。启动一个线程可以调用start();那么停止一个线程可以怎么处理呢?1、interrupt()最正确的停止线程的方... 查看详情

java-多线程-创建线程的三种方式

JAVA-多线程-创建线程的三种方式并发:同一时间只有一条指令在执行,多个进程的指令被快速轮换执行。并行:同一时间有多条指令在多个处理器上运行。进程:每个运行中的程序就是一个进程。线程:线程(Thread)也被称为轻... 查看详情

玩转多线程(代码片段)

玩转多线程目录:创建多线程的三种方式extendsThreadimplementsRunnable匿名类线程创建方式有关构造函数中使用匿名类的说明多线程的核心理论共享性互斥性原子性可见性有序性synchronized使用方法内核剖析volatile使用方法使用场景多线... 查看详情

[java多线程]线程创建的三种方式,线程的互斥(代码片段)

前言多线程:指的是这个程序(一个进程)运行时产生了不止一个线程并行和并发:并行:多个cpu实例或者多台机器同时执行一段处理逻辑,是真正的同时。并发:通过cpu调度算法,让用户看上去... 查看详情

[java多线程]线程创建的三种方式,线程的互斥,线程的同步(代码片段)

前言多线程:指的是这个程序(一个进程)运行时产生了不止一个线程并行和并发:并行:多个cpu实例或者多台机器同时执行一段处理逻辑,是真正的同时。并发:通过cpu调度算法,让用户看上去... 查看详情