본문 바로가기
Backend/JAVA_Basic

24. JAVA, Thread 클래스 (Runnable 인터페이스)

by 개발개발빈이 2022. 6. 8.

○ Thread 클래스

    - 하나의 프로그램이나 하나의 메소드가  CPU자원을 전부 점유하는 것을 막을 수 있다

    - 실시간 채팅, 실시간 예매 등에 많이 사용

 

        ① 쓰레드를 사용하지 않은 경우

class MyThread1 {

    private int num;
    private String name;

    public MyThread1() {}
    public MyThread1(int num, String name) {
        this.num = num;
        this.name = name;
    }

    public void start() {
        run();
    }//start() end

    public void run() {
        for(int a=0; a<num; a++) {
            System.out.println(name+":"+a);
        }
    }//run() end

}//class end


public class Test02_thread {

	public static void main(String[] args) {
		
		MyThread1 t1 = new MyThread1(1000, "★");
		MyThread1 t2 = new MyThread1(1000, "★★");
		MyThread1 t3 = new MyThread1(1000, "★★★");

		t1.start();
		t2.start();  //t1이 1000개가 끝날 때까지 t2는 기다림, 순차적
		t3.start();  //t1, t2가 끝날 때까지 t3는 기다림

	}//main() end

}//class end

Thread를 사용하지 않은 경우

        ② 쓰레드를 사용한 경우

            - JVM이 쓰레드 관리자에 등록하고, start()메소드가 run()을 호출한다

class MyThread2 extends Thread {
	
	private int num;
	private String name;

    public MyThread2() {}
    public MyThread2(int num, String name) {
		this.num = num;
		this.name = name;
	}

    //start()함수는 run()함수를 호출하는 기능이라 따로 override하지 않음
	
	@Override
	public void run() { //비지니스 로직 구현
		for(int a=0; a<num; a++) {
			System.out.println(name+":"+a);
		}
	}//run() end

}//MyThread2 class end


public class Test03_thread {

	public static void main(String[] args) {

		MyThread2 t1= new MyThread2(1000, "★");
		MyThread2 t2= new MyThread2(1000, "★★");
		MyThread2 t3= new MyThread2(1000, "★★★");

		t1.start();
		t2.start();
		t3.start();  // t1이 실행되면서 빈곳에 t2, t3가 끼어들어간다
		
	}//main() end
	
}//class end

Thread를 사용한 경우

 

Runnable 인터페이스를 이용한 쓰레드 구현

    - 다른 클래스를 상속받으면서 thread를 적용해야 할 때

    - interface Runnable {}
      class Thread implements Runnable {}

    - Runnable 인터페이스에는 run()만 있기 때문에, 구현하기 위해서는 Thread도 활용해야함(다형성 이용)

class MyThread3 implements Runnable {//interface는 다중상속 가능

	private int num;
	private String name;
	
	public MyThread3() {}
	public MyThread3(int num, String name) {
		this.num = num;
		this.name = name;
	}
	
	@Override
	public void run() {	
		for(int a=0; a<num; a++) {
			System.out.println(name+":"+a);
		}
	}		

}//MyThread3 class end


public class Test04_thread {

	public static void main(String[] args) {
    
    	Thread t1= new Thread (new MyThread3(1000, "★")); // 다형성
		Thread t2= new Thread (new MyThread3(1000, "★★"));
		Thread t3= new Thread (new MyThread3(1000, "★★★"));
		
		t1.start();
		t2.start();
		t3.start();	// Test_03과 결과는 동일
                
	}//main() end
	
}//class end

 

댓글