동시 테스트 자바 구현

단순히 동시 테스트 를 한다 면 현재 기 존의 테스트 도구 가 많 습 니 다.예 를 들 어 Jmeter 등 입 니 다.하지만 간단 한 인터페이스 테스트 를 해 야 한다 면 아래 코드 를 사용 할 수 있 습 니 다.
여러 스 레 드 를 동시에 실행 하려 면 보통 두 가지 방법 이 있 습 니 다.하 나 는 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 ";
    }
}

상기 두 가 지 는 동시 테스트 의 핵심 코드 에 따 른 것 이다.

좋은 웹페이지 즐겨찾기