• 2020-09-09:裸写算法:两个线程轮流打印数字1-100。


    福哥答案2020-09-09:

    方法1:用一个通道,两个go程的代码不一样。
    方法2:用两个通道,两个go程的代码完全一样。可以扩展成N个go程轮流打印。

    代码用golang编写,代码如下:

    package test38_alternateprint
    
    import (
        "fmt"
        "testing"
        "time"
    )
    
    var POOL = 10
    
    //go test -v -test.run TestAlternatePrint
    func TestAlternatePrint(t *testing.T) {
        AlternatePrint1()
        AlternatePrint2()
    }
    
    //方法1
    func AlternatePrint1() {
        fmt.Println("方法1,两个协程的代码不一样")
        msg := make(chan int)
        go func(p chan int) {
            for i := 1; i <= POOL; i++ {
                p <- i
                if i%2 == 1 {
                    fmt.Println("groutine-1:", i)
                }
            }
        }(msg)
        go func(p chan int) {
            for i := 1; i <= POOL; i++ {
                <-p
                if i%2 == 0 {
                    fmt.Println("groutine-2:", i)
                    fmt.Println("")
                }
            }
        }(msg)
    
        //等待协程执行完成
        time.Sleep(time.Second * 1)
    }
    
    //方法2
    func AlternatePrint2() {
        fmt.Println("方法2,两个go程的代码完全一样")
        const N = 2
        chs := make([]chan struct{}, N)
        for i := 0; i < N; i++ {
            chs[i] = make(chan struct{}, 0)
        }
        start := 1
        for i := 0; i < N; i++ {
            go func(i int) {
                for start <= POOL-N+1 {
                    //获得执行权
                    <-chs[i]
    
                    //执行代码
                    fmt.Printf("go程%d:%d
    ", i, start)
                    if (i+1)%N == 0 {
                        fmt.Println("")
                    }
                    start++
    
                    //给其他协程执行权
                    chs[(i+1)%N] <- struct{}{}
                }
            }(i)
        }
    
        //给第1个协程执行权,第1个协程的序号是0
        chs[0] <- struct{}{}
    
        //等待协程执行完成
        time.Sleep(time.Second * 1)
    
        //收回最后1个go程的执行权
        <-chs[POOL%N]
    }
    

      敲 go test -v -test.run TestAlternatePrint 命令,结果如下:

  • 相关阅读:
    消失之物【背包回退】
    数据库连接JDBC
    Spring事物管理机制简单学习
    java生成验证码并可刷新
    spring加载属性配置文件内容
    java读写属性配置文件
    抓取页面图片元素并保存到本机电脑
    java模拟页面表单登录
    通过java进行电脑屏幕截图
    通过JBOSS服务器来实现JMS消息传送
  • 原文地址:https://www.cnblogs.com/waitmoon/p/13642489.html
Copyright © 2020-2023  润新知