동시 테스트 자바 구현
16108 단어 프로 그래 밍 일기Java
여러 스 레 드 를 동시에 실행 하려 면 보통 두 가지 방법 이 있 습 니 다.하 나 는 Count Downlatch 이 고 하 나 는 Cyclic Barrier 입 니 다.저 는 Cyclic Barrier 로 여러 스 레 드 를 병행 합 니 다.Cyclic Barrier 를 이용 하여 여러 스 레 드 의 동시 다발 을 완성 하 는 프 록 시 예제 입 니 다.여기 서 사용 하 는 것 은 runnable 입 니 다.반환 값 이 없습니다.
(1)반환 값 이 없 는 코드:
public void testCycleBarrier () {
//
int testCount = 100;
CyclicBarrier cyclicBarrier = new CyclicBarrier(testCount);
ArrayList<Future<String>> results = new ArrayList<>();
ExecutorService executorService = Executors.newFixedThreadPool(testCount);
for (int i = 0; i < testCount; i++) {
executorService.execute(new Task(cyclicBarrier));
}
executorService.shutdown();
while (!executorService.isTerminated()) {
try {
Thread.sleep(10);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
public class Task implements Runnable {
private CyclicBarrier cyclicBarrier;
public Task(CyclicBarrier cyclicBarrier) {
this.cyclicBarrier = cyclicBarrier;
}
@Override
public void run() {
try {
//
cyclicBarrier.await();
//
System.out.println("hello word");
} catch (Exception e) {
e.printStackTrace();
}
}
}
(2)반환 값 이 필요 합 니 다.Callable 인터페이스 로 반환 값 을 진행 합 니 다.
public void testCycleBarrierWithCallable () {
//
int testCount = 100;
CyclicBarrier cyclicBarrier = new CyclicBarrier(testCount);
ArrayList<Future<String>> results = new ArrayList<>();
ExecutorService executorService = Executors.newFixedThreadPool(testCount);
for (int i = 0; i < testCount; i++) {
results.add(executorService.submit(new TaskFromCallable(cyclicBarrier)));
}
//
boolean isDone = false;
while (!isDone) {
isDone = true;
for (Future<String> future : results) {
if (!future.isDone()) {
isDone = false;
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
}
break;
}
}
}
executorService.shutdown();
for (Future<String> future : results) {
try {
//
System.out.println(future.get());
} catch (InterruptedException e) {
e.printStackTrace();
} catch (ExecutionException e) {
e.printStackTrace();
}
}
}
public class TaskFromCallable implements Callable<String> {
private CyclicBarrier cyclicBarrier;
public TaskFromCallable(CyclicBarrier cyclicBarrier) {
this.cyclicBarrier = cyclicBarrier;
}
@Override
public String call() throws Exception {
return "hello ";
}
}
상기 두 가 지 는 동시 테스트 의 핵심 코드 에 따 른 것 이다.
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
자바를 잡아버려 (1)나의 생각을 적고 복습을 해버릴 것 이다 책을 펼치자 마자 나오는 설명인데 그 안의 내용을 실행하게 된다 라고 설명을 해준다 아래 소스코드와 실행 결과로 위에 설명을 보충해준다 사칙연산과 나머지를 계산하는 것 비교연...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.