写两个线程交替打印 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();
}