Binary World

JAVA CLASS : 쓰레드(Thread) 본문

개발자의 길/JAVA

JAVA CLASS : 쓰레드(Thread)

모쿠 2017. 1. 12. 16:06

<쓰레드(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 : ㅎㅎ 


Comments