package multi_thread;
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) {}
}
}
}
package multi_thread;
import java.awt.Toolkit;
public class BeepPrintExample {
public static void main(String[] args) {
// 방법 1
Runnable beepTask = new BeepTask(); // Runnable 상속 받은 BeepTask 클래스
Thread thread = new Thread(beepTask);
thread.start();
// 방법 2 (익명 객체 이용)
/*
Thread thread2 = new Thread(new Runnable() {
@Override
public void run() {
Toolkit toolkit = Toolkit.getDefaultToolkit();
for(int i = 0 ; i < 5 ; i++) {
toolkit.beep();
try {Thread.sleep(500);} catch(Exception e) {}
}
}
});
thread2.start();
*/
for (int i = 0 ; i < 5 ; i++) {
System.out.println("띵");
try {Thread.sleep(500);} catch(Exception e) {}
}
}
}
스레드란 하나를 실행시키는 역할을 하는 것을 의미합니다.
(말이 하나지 100개의 업무를 한 사람이 하는 거라고 생각하시면 됩니다.)
(예를 들어 자바를 실행시키면 메인스레드만 돌아감)
멀티스레드란 여러개를 동시에 실행 시킬 수 있게 만들어서 병렬적으로 처리할 수 있는 것이죠
병렬적으로 처리하면 여러개의 일을 분담하니 효율적이겠죠?
메인 스레드가 작업스레드보다 먼저 종료되더라도
다른 스레드가 계속 실행중이라면 프로세스는 종료되지 않는 특징이 있습니다.
Runnable은 작업 스레드가 실행 할 수 있는 코드를 가지고 있는 객체라고 해서 붙여진 이름입니다.
인터페이스 타입이기 때문에 구현 객체를 만들어 대입해야한다. run()을 재정의해서 실행할 코드를 적어야합니다.
class Task implements Runnable{
public void run(){
실행할 자바코드
}
}
이런 식이 기본 구조입니다.
위에 예제는 컴퓨터에서 띵소리를 내게 하는 toolkit이라는 걸을 이용해 소리를 내면서
그와 동시에 for문을 이용해 띵이라는 걸 출력해보려고 합니다. 그러면 두개가 동시에 작동해야 겠죠?
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) {}
}
}
}
run안에 스레드 내용에는 toolkit.beep()이 0.5초의 간격을두고 5번 반복하게 끔 만들었습니다.
beepTask라는 객체를 만듭니다.
또한 Runnable내용을 실행시킬 스레드를 만듭니다.(thread)
그리고 Runnable 내용을 그 안에 넣습니다. ( Thread thread = new Thread(beepTask) ) 선언과 Runnable 내용 넣기
thread.start로 Thread를 실행시킵니다.
이러면 메인 Thread에서는 이걸 일 하고 다른 스레드에서는 컴퓨터에서 띵소리를 내게하는 일을 합니다. (병렬)
Runnable을 상속받는 클래스를 만들어서 쓰는 위에 방법과 그렇지 않고 바로 메인쓰레드에서 선언과 동시에
쓰는 익명 객체를 이용하는 방식이 있습니다.
익명 객체란 일회성이고 파일을 줄일 수 있는 장점이 있습니다. 자세한 건 나중에 포스팅하겠습니다.
Thread thread2 = new Thread (new Runnable() {
@Override
public void run() {
스레드내용
}
});
이러한 구조가 됩니다. Thread 매개변수에는 Runnable객체가 들어가야하는데 그걸 밑에 바로 정의시켜주는 것이죠
'[Java] > [Java]' 카테고리의 다른 글
[Java] 자바 멀티스레드 [Multi-Thread] 스레드 이름 설정하기 (setName, getName) (0) | 2021.08.04 |
---|---|
[Java] 자바 멀티스레드 [Multi-Thread] (Thread) (0) | 2021.08.04 |
[Java] 자바 Throw , Throws 예외 처리 (0) | 2021.08.04 |
[Java] 자바 중첩 인터페이스(Interface) (0) | 2021.08.02 |
[Java] 자바 중첩 클래스, 로컬 클래스 (Class) (0) | 2021.08.02 |