生产者开发者.java golang代码比较

我这边写的代码不一定规范 但我想足够可以表示出来了

go是最近有学了一段时间了 觉得一些特性(go关键字 内置的channel类型)非常方便 

以下是代码:

 首先是java的

public void testBlocking() throws InterruptedException{
	final BlockingQueue<String> bq=new LinkedBlockingQueue<String>();
	final AtomicBoolean isStop=new AtomicBoolean(false);
	new Thread(new Runnable() {
		@Override
		public void run() {
		  int i=0;
		  while(true){
		  while(!bq.offer("物品"+i++)){};
		  while(!bq.offer("物品"+i++)){};
		  if(i>=100){
			  isStop.compareAndSet(false, true);
			  break;
		  }
		  try {
			Thread.sleep(500);
		} catch (InterruptedException e) {
			e.printStackTrace();
		}
		  }
			
		}
	}).start();
	
	while(true){
		System.out.println(bq.take());
		if(bq.isEmpty()&&isStop.get()){
			break;
		}
	}
}

 用了一个堵塞的链表作为传递的对象 为了保证原子性操作 使用了AtomicBoolean这个类

 因为i是方法的本地变量 AtomicBoolean可以保证赋值和取值的原子性 只有两个线程的关系 不用加锁和同步块

这个会每隔500毫秒 打印两个物品 一直从物品0到物品99 

 

然后用Go实现的:

package main
import(
"fmt"
"strconv"
"time"
)
func main (){

item:=make(chan string,10)
singal:=make(chan int)

var count int
go func(item chan<- string,singal chan int){ 
   for{
   count++
   item<-"物品"+strconv.Itoa(count)
   count++
   item<-"物品"+strconv.Itoa(count)
   if count<100{
   singal<- 1
   }else{
   singal<- -1
   break
   }
   time.Sleep(3000*time.Millisecond)
  }
}(item,singal)

for{
 select {
    case s:=<-item:{
	  fmt.Println(s)
	}
	case flag:=<-singal:{
	  if(flag==-1){
	    goto end
	  }
	}
 }
}

end:

}

 

哪里有错误欢迎指正

 

不看代码的长度 用了channel的go相对来说理解起来也更加直观 简单.

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值