写两个线程交替打印 1~100 的奇偶数

代码如下:

import (
	"fmt"
	"time"
)

type Tongbu struct {

	selectChannel chan int
}
var wg sync.WaitGroup
func main(){
	
	wg.Add(2)
	tong:=Tongbu{}
	tong.selectChannel=make(chan struct{})
    go tong.printOld()

	go tong.printEvent()
	wg.wait()

}

// 打印奇数
func (tong *Tongbu)printOld(){
	defer wg.Done()
	for i:=0;i<100;i++{
		// 阻塞当前协程
		tong.selectChannel<-struct{}
		if i%2==1{
			fmt.Printf("奇数%v\n",i)
		}


	}
	return

}
// 打印偶数
func (tong *Tongbu)printEvent(){
    defer wg.Done()
	for i:=0;i<101;i++{
		<-tong.selectChannel
		if i%2==0{
			fmt.Printf("偶数%v\n",i)
		}

	}
	return
}

java 实现
Java 实现两个线程交替打印0~100 的奇偶数,主要通过上锁。是线程1打印之后唤醒其他线程,然后让出锁,自己进入休眠状态。因为进入了休眠状态就不会与其他线程抢锁,此时只有线程2在获取锁,所以线程2必然会拿到锁。线程2以同样的逻辑执行,唤醒线程1并让出自己持有的锁,自己进入休眠状态。这样来来回回,持续执行直到任务完成。就达到了两个线程交替获取锁的效果了。

  private static int count=0;
    private static Object lock=new Object();
    public static void main(String[] args) {
        Thread odd = new Thread(() -> {
            while(count<=100){
                synchronized (lock){
                    System.out.println(Thread.currentThread().getName()+":"+count++);
                    lock.notifyAll();
                    try {
                        // 进行休眠,不争夺锁,等到另一个线程的唤醒
                        if(count<=100)
                        lock.wait();
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                }
            }
        }, "偶数");
        Thread even = new Thread(() -> {
            while(count<=100){
                synchronized (lock){
                    System.out.println(Thread.currentThread().getName()+":"+count++);
                    lock.notifyAll();
                    try {
                        // 没有if 判断语句就会,就会一个线程一直阻塞
                        if(count<=100)
                        lock.wait();
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                }
            }

        }, "奇数");
        odd.start();
        even.start();
    }