본문 바로가기
Programing/JAVA (& 혼공자Java)

자바(Java) - 스레드2 (toolkit.beep(); 비프음 실행)

by a.k.a DUKI 2020. 12. 15.
728x90
반응형

작업 스레드 생성과 실행

멀티 스레드로 실행하는 애플리케이션을 개발하기 위해서는 몇개의 작업을 병렬로 실행하지 결정하고 각 작업별로 스레드를 생성해야 한다.

모든 자바 애플리케이션 메인 스레드는 반드시 존재하기 때무에 메인 작업 이외에 추가적인 병렬 작업의 수만큼 스레드를 생성하여 이용하면 된다.

  • java.lang.Thread 클래스를 직접 객체화 해서 생성 가능
  • Thread클래스를 상속해서 하위 클래스를 만들어 생성 가능

 

Thread클래스로부터 직접 생성

Thread thread = new Thread(Runnable target);

java.lang.Thread클래스로부터 작업 스레드를 직접 실행하려면, Runnable을 매개값으로 갖는 생성자를 호출한다.

 

Runnable은 인터페이스 타입이여서 구현 객체를 만들어 대입해야 한다. Runnable에 run()메소드르르 재정의하여 작업스레드가 실행할 코드를 작성해야한다.

class Task implements Runnable{
	public void run(){
    	스레드가 실행할 코드;
    }
}

 

Runnable 구현객체를 생성 후 이것을 매개값으로 해서 Thread생성자를 호출해야 스레드가 생성된다.

Thread thread = new Thread(new Runnable(){ //익명 구현 객체
	public void run(){
    	스레드가 실행할 코드;
    }
}

 

실행을 위해서는 start()메소드를 호출 해야 실행된다.

thread.start();

 

start() 메소드가 호출 되면, 작업 스레드는 매개값으로 받은 Runnable의 run()메소드를 실행하면서 자신의 작업을 처리한다.

혼공자 책 참고

 

 

 

예시1) 비프음 예시 - 메인스레드만 이용한 경우

import java.awt.Toolkit;

public class BeepPrintEx1 {
	public static void main(String[] args) {
		// Toolkit 객체 얻기
		Toolkit toolkit = Toolkit.getDefaultToolkit();
		toolkit.beep();
		for (int i = 0; i < 5; i++) {
			toolkit.beep(); // 비프음 발생
			try {
				Thread.sleep(500); // 0.5초 일시정지
			} catch (Exception e) { // Thread가 들어간 문장은 반드시 예외처리를 해야한다.
			}
		}

		for (int i = 0; i < 5; i++) {
			System.out.println("띵");
			try {
				Thread.sleep(500); // 0.5초 일시정지
			} catch (Exception e) { // Thread가 들어간 문장은 반드시 예외처리를 해야한다.
			}
		}
	}
}

tip) Thread.sleep(1000)은 ( )안에 1/1000(초) 단위 이다. 0.5초 간격으로 들리고 "띵"을 출력한다.

 

 

예시2) 비프음 예시 - 메인스레드가 아닌 다른 스레드를 이용 경우

비프음을 들려주는 작업 정의

import java.awt.Toolkit;

public class BeepTask implements Runnable {
	public void run() {
		// 스레드 실행 내용
		Toolkit toolkit = Toolkit.getDefaultToolkit();
		for (int i = 0; i < 5; i++) {
			toolkit.beep();
			try {
				Thread.sleep(500);
			} catch (Exception e) {
			}
		}
	}
}

메인 스레드와 작업 스레드가 동시에 실행

public class BeepPrintEx2 {
	public static void main(String[] args) {
		Runnable beepTask = new BeepTask();
		Thread thread = new Thread(beepTask);
		thread.start(); // BeepTask의 스레드 실행내용 실행

		for (int i = 0; i < 5; i++) {
			System.out.println("띵");
			try {
				Thread.sleep(500); // 0.5초 일시정지
			} catch (Exception e) { // Thread가 들어간 문장은 반드시 예외처리를 해야한다.
			}
		}
	}

}

 

 

예시3) 비프음 예시 - 메인스레드가 아닌 다른 스레드를 이용 경우2

익숙하지는 않지만 이 방법이 조금 더 코드가 간략하다라는 느낌이 있다. 

import java.awt.Toolkit;

public class BeepPrintEx3 {
	public static void main(String[] args) {
		Thread thread = new Thread(new Runnable() {
			@Override
			public void run() {
				// Toolkit 객체 얻기
				Toolkit toolkit = Toolkit.getDefaultToolkit();
				for (int i = 0; i < 5; i++) {
					toolkit.beep(); // 비프음 발생
					try {
						Thread.sleep(500); // 0.5초 일시정지
					} catch (Exception e) { // Thread가 들어간 문장은 반드시 예외처리를 해야한다.
					}
				}
			}
		});
		thread.start();

		for (int i = 0; i < 5; i++) {
			System.out.println("띵");
			try {
				Thread.sleep(500); // 0.5초 일시정지
			} catch (Exception e) { // Thread가 들어간 문장은 반드시 예외처리를 해야한다.
			}
		}
	}
}

 

 


※용어 정리

 

  • 프로세스: 애플리케이션을 실행하면 운영체제로부터 실행에 필요한 메모리를 할당받아 애플리케이션이 실행되는 것이다.

  • 멀티 스레드: 하나의 프로세스 내에 동시 실행을 하는 스레드들이 2개 이상인 경우이다.

  • 메인 스레드: 자바의 모든 애플리케이션은 메인 스레드가 main()메소드를 싱행하면서 시작한다. 메인 스레드는 main() 메소드의 첫 코드부터 아래로 순차적으로 실행하고, main()메소드의 마지막 코드를 실행하거나 return문을 만나면 실행이 종료 된다.

  • 작업 스레드: 메인 작업 이외에 병렬 작업의 수만큼 생성하는 스레드를 말한다. 작업 스레드도 객체로 생성되기 때문에 크래스가 필요하다. Thread 클래스를 직접 객체화해서 생성할 수도 있고, Thread클래스를 상속해서 하위 클래스를 만들어 생성할 수도 있다.

 

 

 

본 내용은 #혼자공부하는자바 책을 참고해 공부하려 작성했습니다.

 

728x90
반응형

댓글