Java - 6. Thread: Single vs. Multi

갓김치·2020년 9월 22일
0

고급자바

목록 보기
14/47

참고: 지난 글에 이어 쭉 싱글vs멀티 비교

T04~T08

예제

T04_ThreadTest.java

  • 1~20억까지의 합계를 구하는데 걸린 시간 체크하기
  • 전체 합계를 구하는 작업을 단독으로 처리했을때 (싱글 스레드) vs. 여러 스레드로 분할해서 작업할 때 시간 비교

1단계: 합계 구하는 스레드

class SumThread extends Thread {
  private long max, min;

  public SumThread(long min, long max) {
    this.min = min;
    this.max = max;
  }

  @Override
  public void run() {
    long sum = 0L;
    for(long i=min; i <=max; i++) {
        sum += i;
    }
    System.out.println(min + " ~ " + max + "까지의 합 : " + sum);
  }
}

2단계: main()에서 실행

싱글 스레드: 처리시간 931ms

SumThread sm = new SumThread(1l, 2000000000L); // 20억

long startTime = System.currentTimeMillis();

sm.start();

try {
  sm.join();
} catch (InterruptedException e) {
  e.printStackTrace();
}

long endTime = System.currentTimeMillis();

// 단독으로 처리할 때의 처리시간(ms)
long result = endTime - startTime; // 931ms

멀티 스레드: 처리시간 124ms

SumThread[] sumThs = new SumThread[] {
  new SumThread(         1L,  500000000L),
  new SumThread( 500000001L, 1000000000L),
  new SumThread(1000000001L, 1500000000L),
  new SumThread(1500000001L, 2000000000L)
};

startTime = System.currentTimeMillis();

for(SumThread th : sumThs) {
  th.start();
}

for(SumThread th : sumThs) {
  try {
    th.join();
  } catch (InterruptedException e) {
    e.printStackTrace();
  }
}

endTime = System.currentTimeMillis();

// 협력해서 처리할 때의 처리시간(ms)
long result =  endTime - startTime; // 124ms

T05, T06

T05: 단일 스레드에서의 사용자 입력 처리

public class T05_ThreadTest {
public static void main(String[] args) {
  String str = JOptionPane.showInputDialog("아무거나 입력하세요.");
  System.out.println("입력한 값은 " + str + "입니다.");
  for (int i = 10; i >=1; i--) {
    System.out.println(i);

    try {
      Thread.sleep(1000); // 1초동안 잠시 멈춘다.
    } catch (InterruptedException e) {
      e.printStackTrace();
    }
  }
} // main
} // class

T06: 멀티 스레드를 활용한 카운트다운 처리

1단계: 데이터를 입력받는 스레드

class DataInput extends Thread {
  @Override
  public void run() {
    String str = JOptionPane.showInputDialog("아무거나 입력해");
    System.out.println("입력한 값은 " + str + "입니다.");

    // 입력이 완료되면 inputCheck변수를 true로 변경한다.
    T06_ThreadTest.inputCheck = true;
  }
}

2단계: 카운트다운 처리를 위한 스레드

class CountDown extends Thread {
@Override
public void run() {
	
  for (int i = 10; i >=1; i--) {
    // 입력이 완료되었는지 여부를 검사하고 입력이 완료되면
    // run() 메서드를 종료시킨다. 즉 현재쓰레드를 종료시킨다.
    if(T06_ThreadTest.inputCheck == true) {
      return; // run()메서드가 종료되면 쓰레드로 죽는다.
    }

    System.out.println(i);

    try {
      Thread.sleep(1000); // 1초동안 잠시멈춤
    } catch (InterruptedException e) {
      e.printStackTrace();
    }
  }

  // 10초가 경과되었는데도 입력이 없으면 프로그램을 종료한다.
  System.out.println("10초가 지났습니다. 프로그램을 종료합니다.");
  System.exit(0); // 프로그램을 종료시키는 명령
}
}

3단계: 함께 사용

public class T06_ThreadTest {
  // 입력여부를 확인하기 위한 변수 선언
  // 모든 쓰레드에서 공통으로 사용할 변수
  public static boolean inputCheck = false;

  public static void main(String[] args) {
    Thread th1 = new DataInput();
    Thread th2 = new CountDown();

    th1.start();
    th2.start(); 
  } // main
}
profile
갈 길이 멀다

0개의 댓글