생산자 개발 자 자바 골 랑 코드 비교
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 를 사용 하여 상대 적 으로 이해 하기 도 더욱 직관 적 이 고 간단 하 다.
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
set containerThere is no built-in set container in Go How to implement Set struct{} => type struct{}{} => 0bytes How to create set :=...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.