JAVA CLASS : 쓰레드(Thread)
<쓰레드(Thread)>
* 쓰레드(Thread): 하나의 작업을 순차적으로 진행하는 실행 코드
* 멀티 쓰레드 프로그램:
* 하나의 프로그램에서 여러개의 쓰레드를 실행시켜 동작하는 프로그램
(예) 채팅 프로그램: 채팅 + 파일 전송
* 자바에서 쓰레드를 생성하고 사용하는 방법 1 => ThreadMain01.java
1. Thread 클래스를 상속받는 클래스를 정의 (extends Thread)
2. 정의한 새로운 클래스 안에서 run() 메소드를 override
-> run(): 쓰레드가 해야 할 기능들을 구현
3. 정의한 클래스의 인스턴스를 생성
4. 생성된 인스턴스에서 start() 메소드를 호출
-> 쓰레드 가져야 할 메모리 공간을 확보, 스케쥴링을 위해서 쓰레드를 등록, 초기화
-> 쓰레드의 run() 메소드가 자동으로 실행됨
* 자바는 다중 상속을 허용하지 않기 때문에 다른 클래스를 이미 상속 받고 있는 경우에는 Thread 클래스를 상속받을 수 없음.
* Runnable 인터페이스를 구현해서 Thread를 생성할 수 있는 방법을 제공.
* 자바에서 쓰레드를 생성하고 사용하는 방법 2 => ThreadMain03.java
1. Runnable 인터페이스를 구현하는 클래스를 정의
2. 정의한 클래스에서 run() 메소드를 override
-> 쓰레드가 해야 할 기능 구현
3. 정의한 클래스(Runnable 구현 클래스)의 인스턴스 생성
4. Runnable 인스턴스를 매개변수로 해서 Thread 인스턴스를 생성
new Thread(runnable); 호출
Thread 인스턴스에서 start() 메소드를 호출 -. run() 자동 호출
<프로그램 코드>
* TreadMain01.java
package edu.java.thread01; // 1. Thread 클래스를 상속받는 새로운 클래스 정의 class MyThread extends Thread { // 멤버 변수(필드) private String msg; // 생성자 public MyThread(String msg) { this.msg = msg; } // 메소드 // 2. run() 메소드를 override - 쓰레드가 해야 할 기능들을 구현 @Override public void run() { for (int i = 0; i < 10; i++) { System.out.println(i + " : " + msg); try { sleep(10); } catch (InterruptedException e) { // TODO Auto-generated catch block e.printStackTrace(); } // 10 milli second 동안 일을 멈춤 } // end for } // end run() } public class ThreadMain01 { public static void main(String[] args) { // 3. 정의한 클래스의 인스턴스를 생성 MyThread my = new MyThread("안녕"); // 4. 생성된 인스턴스에서 start() 메소드를 호출 - 쓰레드 실행 my.start(); // 별도의 메모리 공간을 확보해서 실행됨 Thread th2 = new MyThread("hello"); th2.start(); // my.run();// 쓰레드를 생성하는 것이 아니라 인스턴스를 호출하는 것임 // join(): 해당 쓰레드가 종료될 때까지 기다림 System.out.println("<<<<< 메인 쓰레드 종료 >>>>>"); } // end main() } // end class ThreadMain01 |
* 출력화면
<<<<< 메인 쓰레드 종료 >>>>> 0 : hello 0 : 안녕 1 : hello 1 : 안녕 2 : hello 2 : 안녕 3 : hello 3 : 안녕 4 : hello 4 : 안녕 5 : hello 5 : 안녕 6 : 안녕 6 : hello 7 : 안녕 7 : hello 8 : hello 8 : 안녕 9 : 안녕 9 : hello |
* ThreadMain03.java
package edu.java.thread03; class MyRunnable implements Runnable {
// 멤버 변수 private String msg; public MyRunnable(String msg) { this.msg = msg; } @Override public void run() { for (int i = 0; i< 10; i++ ){ System.out.println(i + " : " + msg); try { Thread.sleep(100); // Thread 메소드에 있기 때문에 직접 불러와야한다. } catch (InterruptedException e) { // TODO Auto-generated catch block e.printStackTrace(); } } } // end run()
} public class ThreadMain03 { public static void main(String[] args) { MyRunnable r1 = new MyRunnable("안녕"); Runnable r2 = new MyRunnable("ㅎㅎ");
Thread th1 = new Thread(r1); Thread th2 = new Thread(r2);
th1.start(); th2.start(); System.out.println("<<<<< 메인 쓰레드 종료 >>>>>");
} // end main() } // end class ThreadMain03 |
* 출력화면
<<<<< 메인 쓰레드 종료 >>>>> 0 : ㅎㅎ 0 : 안녕 1 : ㅎㅎ 1 : 안녕 2 : 안녕 2 : ㅎㅎ 3 : ㅎㅎ 3 : 안녕 4 : ㅎㅎ 4 : 안녕 5 : 안녕 5 : ㅎㅎ 6 : ㅎㅎ 6 : 안녕 7 : 안녕 7 : ㅎㅎ 8 : 안녕 8 : ㅎㅎ 9 : 안녕 9 : ㅎㅎ |