생산자 개발 자 자바 골 랑 코드 비교

2253 단어 golang
제 가 쓴 코드 가 꼭 규범 에 맞지 는 않 지만 충분히 표시 할 수 있 을 것 같 아 요.
go 는 최근 에 배 운 게 있어 서 좀 편 해 요. 
다음은 코드:
 일단 자바 거.
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;
		}
	}
}

 막 힌 링크 를 전달 대상 으로 원자 성 조작 을 위해 Atomic Boolean 같은 종 류 를 사용 했다.
 i 는 방법의 로 컬 변수 이기 때문에 Atomic Boolean 은 할당 과 값 을 추출 하 는 원자 성 을 확보 할 수 있 습 니 다. 두 스 레 드 의 관계 만 잠 금 과 동기 화 블록 을 추가 하지 않 아 도 됩 니 다.
이 아 이 템 은 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 를 사용 하여 상대 적 으로 이해 하기 도 더욱 직관 적 이 고 간단 하 다.

좋은 웹페이지 즐겨찾기