비주류 동시 도구의 Exchanger

1789 단어
Exchanger 두 라인을 서로 기다리게 하고 계산 결과를 교환하는 데 쓰인다.이 종류의 사용법은 매우 간단하다. 왜냐하면 두 개의 무거운 exchange 방법을 정의했기 때문이다. 파라미터가 많은 것은 시간 초과에 대한 지원을 증가시켰기 때문이다.한 스레드 호출exchange이 있을 때(계산 결과를 매개 변수로 삼음), 다른 스레드 호출exchange을 기다리기 시작하고, 두 스레드가 각각 상대방 호출exchange 시 전송된 매개 변수를 받아 계산 결과의 교환을 완성한다.
너무 많은 설명을 하지 않아도 아래의 이 예를 실행하면 명백히 알 수 있다.

final Exchanger<String> e = new Exchanger<>();

new Thread() {
    @Override
    public void run() {
        long id = Thread.currentThread().getId();
        String s = "abc";
        System.out.println("  [" + id + "]   " + s);

        try {
            TimeUnit.SECONDS.sleep(new Random().nextInt(5));
            System.out.println("  [" + id + "]   " + e.exchange(s));
        } catch (InterruptedException ex) {
            ex.printStackTrace();
        }
    }
}.start();

new Thread() {
    @Override
    public void run() {
        long id = Thread.currentThread().getId();
        String s = "xyz";
        System.out.println("  [" + id + "]   " + s);

        try {
            TimeUnit.SECONDS.sleep(new Random().nextInt(5));
            System.out.println("  [" + id + "]   " + e.exchange(s));
        } catch (InterruptedException ex) {
            ex.printStackTrace();
        }
    }
}.start();
    

실행 결과(가능한 경우):
  [9]   abc
  [10]   xyz
  [10]   abc
  [9]   xyz

마지막으로 강조하자면, 이 종류는 두 개의 라인에만 적용되며, 그것을 이용하여 여러 생산자와 소비자 간의 데이터 교환을 처리하려는 것은 반드시 실패할 것이다.

좋은 웹페이지 즐겨찾기