Java 병렬 새 위젯의 Exchanger
Exchanger 클래스를 보여주기 위해 생산자와 소비자 임무를 만들 것입니다.Exchanger Producer와 Exchanger Consumer는 교환을 요구하는 대상으로 List
import java.util.List;
import java.util.concurrent.CopyOnWriteArrayList;
import java.util.concurrent.Exchanger;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.TimeUnit;
class ExchangerProducer implements Runnable {
private List<Fat> holder;
private Exchanger<List<Fat>> exchanger;
public ExchangerProducer(Exchanger<List<Fat>> exchanger, List<Fat> holder) {
this.exchanger = exchanger;
this.holder = holder;
}
@Override
public void run() {
try {
while(!Thread.interrupted()) {
//
for (int i = 0;i < ExchangerDemo.size; i++) {
holder.add(new Fat());
}
//
holder = exchanger.exchange(holder);
}
} catch (InterruptedException e) {
}
System.out.println("Producer stopped.");
}
}
class ExchangerConsumer implements Runnable {
private List<Fat> holder;
private Exchanger<List<Fat>> exchanger;
private volatile Fat value;
private static int num = 0;
public ExchangerConsumer(Exchanger<List<Fat>> exchanger, List<Fat> holder) {
this.exchanger = exchanger;
this.holder = holder;
}
@Override
public void run() {
try {
while(!Thread.interrupted()) {
//
holder = exchanger.exchange(holder);
//
for (Fat x : holder) {
num++;
value = x;
// , CopyOnWriteArrayList
holder.remove(x);
}
if (num % 10000 == 0) {
System.out.println("Exchanged count=" + num);
}
}
} catch (InterruptedException e) {
}
System.out.println("Consumer stopped. Final value: " + value);
}
}
public class ExchangerDemo {
static int size = 10;
static int delay = 5; //
public static void main(String[] args) throws Exception {
ExecutorService exec = Executors.newCachedThreadPool();
List<Fat> producerList = new CopyOnWriteArrayList<>();
List<Fat> consumerList = new CopyOnWriteArrayList<>();
Exchanger<List<Fat>> exchanger = new Exchanger<>();
exec.execute(new ExchangerProducer(exchanger, producerList));
exec.execute(new ExchangerConsumer(exchanger, consumerList));
TimeUnit.SECONDS.sleep(delay);
exec.shutdownNow();
}
}
class Fat {
private volatile double d;
private static int counter = 1;
private final int id = counter++;
public Fat() {
//
for (int i = 1; i<10000; i++) {
d += (Math.PI + Math.E) / (double)i;
}
}
public void print() {System.out.println(this);}
public String toString() {return "Fat id=" + id;}
}
실행 결과(가능한 결과):
Exchanged count=10000
Exchanged count=20000
Exchanged count=30000
Exchanged count=40000
Exchanged count=50000
Exchanged count=60000
Exchanged count=70000
Exchanged count=80000
Consumer stopped. Final value: Fat id=88300
Producer stopped.
main () 에서 두 작업에 사용할 단일한 Exchanger, 교환에 사용할 CopyOnWrite Array List 두 개를 만들었습니다.이 특정한List 변체는 목록이 옮겨다닐 때remove () 방법을 호출할 수 있으며, Concurrent Modified Exception 이상을 던지지 않습니다.Exchanger Producer는 이 리스트를 채운 다음, 이 가득 찬 목록을 Exchanger Consumer의 빈 목록과 교환합니다.교환 후 Exchanger Producer는 계속 Fat 대상을 생산할 수 있고 Exchanger Consumer는 목록에 가득한 대상을 사용하기 시작합니다.Exchanger가 있기 때문에, 하나의 목록을 채우고 다른 목록을 소비하는 것이 동시에 발생한다.
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
DELL 서버의 디스크 교체를 시도한 @PowerEdge요 전날 DELL 서버의 4 개의 디스크 슬롯 램프 DELL 지원에 문의 한 곳, "디스크의 고장이라고 판단하겠습니다"라는 것 디스크를 주문하려고했을 때 지원에서 의외의 답변 이미 디스크 재고가 없으며, 나머지 재고...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.