Notice
Recent Posts
Recent Comments
«   2024/11   »
1 2
3 4 5 6 7 8 9
10 11 12 13 14 15 16
17 18 19 20 21 22 23
24 25 26 27 28 29 30
Archives
Today
Total
관리 메뉴

충분히 쌓여가는

쓰레드의 구현과 실행 본문

Java/JAVA3

쓰레드의 구현과 실행

빌드이너프 2023. 8. 2. 10:09

쓰레드의 구현

① Thread 클래스를 상속

class MyThread extends Thread {
    public void run() { // Thread 클래스의 run()을 오버라이딩
        /* 작업내용 */
    }
}

 

MyThread t1 = new MyThread(); // 쓰레드의 생성
t1.start(); // 쓰레드의 실행

 

② Runnable 인터페이스를 구현

class MyThread2 implements Runnable {
    public void run() { // Runnable 인터페이스의 추상메서드 run()을 구현
        /* 작업내용 */
    }
}

 

Runnable r = new MyThread2();
Thread t2 = new Thread(r); // Thread(Runnable r)
// Thread t2 = new Thread(new MyThread2());

t2.start();

코드

싱글 쓰레드

class ThreadTest {
    public static void main(String args[]) {
    
        for(int i=0; i < 5; i++) {
            System.out.println(0);
        }

        for(int i=0; i < 5; i++) {
            System.out.println(1);
        }
        
    }
}


0
0
0
0
0
1
1
1
1
1

 

멀티쓰레드

class ThreadTest {
    public static void main(String args[]) {
        ThreadEx1_1 t1 = new ThreadEx1_1();

        Runnable r = new ThreadEx1_2();
        Thread t2 = new Thread(r);	  // 생성자 Thread(Runnable target)

        t1.start();
        t2.start();
        
    }
}

class ThreadEx1_1 extends Thread { // Thread 클래스를 상속해서 쓰레드를 구현
    public void run() { // 쓰레드가 수행할 작업을 작성
        for(int i=0; i < 5; i++) {
            System.out.println(this.getName()); // 조상인 Thread의 getName()을 호출, this 생략 가능
        }
    }
}

class ThreadEx1_2 implements Runnable { // Runnable 인터페이스를 구현해서 쓰레드를 구현
    public void run() { // 쓰레드가 수행할 작업을 작성
        for(int i=0; i < 5; i++) {
            // Thread.currentThread() - 현재 실행중인 Thread를 반환한다.
            System.out.println(Thread.currentThread().getName());
        }
    }
}


Thread-0
Thread-0
Thread-0
Thread-0
Thread-0
Thread-1
Thread-1
Thread-1
Thread-1
Thread-1

쓰레드가 작업을 따로 돌리는 것 확인

class ThreadTest {
    public static void main(String args[]) {
        ThreadEx1_1 t1 = new ThreadEx1_1();

        Runnable r = new ThreadEx1_2();
        Thread t2 = new Thread(r);	  // 생성자 Thread(Runnable target)

        t1.start();
        t2.start();

    }
}

class ThreadEx1_1 extends Thread { // Thread 클래스를 상속해서 쓰레드를 구현
    public void run() { // 쓰레드가 수행할 작업을 작성
        for(int i=0; i < 500; i++) {
            System.out.print(0);
        }
    }
}

class ThreadEx1_2 implements Runnable { // Runnable 인터페이스를 구현해서 쓰레드를 구현
    public void run() { // 쓰레드가 수행할 작업을 작성
        for(int i=0; i < 500; i++) {
            System.out.print(1);
        }
    }
}

 

만약 싱글쓰레드로 돌리면 절대 섞이지 않는다

class ThreadTest {
    public static void main(String args[]) {

        for(int i=0; i < 500; i++) {
            System.out.print(0);
        }

        for(int i=0; i < 500; i++) {
            System.out.print(1);
        }

    }
}


쓰레드의 실행 - start()

쓰레드를 생성한 후에 start()를 호출해야 쓰레드가 작업을 시작한다

start() 했다고 즉시 실행되는 것은 아님(OS 스케줄러가 실행순서를 결정한다)

ThreadEx1_1 t1 = new ThreadEx1_1(); // 쓰레드 t1을 생성한다
ThreadEx1_1 t2 = new ThreadEx1_1(); // 쓰레드 t2을 생성한다

t1.start(); // 쓰레드 t1을 실행시킨다
t2.start(); // 쓰레드 t2를 실행시킨다

 

코드

0을 출력하는 부분에서 start()를 했다고 0이 출력되는 것이 아닌 1이 먼저 출력될 수도 있다

class ThreadTest {
    public static void main(String args[]) {
        ThreadEx1_1 t1 = new ThreadEx1_1();

        Runnable r = new ThreadEx1_2();
        Thread t2 = new Thread(r);	  // 생성자 Thread(Runnable target)

        t1.start(); // 0출력
        t2.start(); // 1출력

    }
}

class ThreadEx1_1 extends Thread { // Thread 클래스를 상속해서 쓰레드를 구현
    public void run() { // 쓰레드가 수행할 작업을 작성
        for(int i=0; i < 500; i++) {
            System.out.print(0);
        }
    }
}

class ThreadEx1_2 implements Runnable { // Runnable 인터페이스를 구현해서 쓰레드를 구현
    public void run() { // 쓰레드가 수행할 작업을 작성
        for(int i=0; i < 500; i++) {
            System.out.print(1);
        }
    }
}


start()와 run()

run()을 작성했는데 왜 start()를 호출하는지에 대한 의문점

class ThreadTest {
    public static void main(String args[]) {
       MyThread t1 = new MyThread(); // 1. 생성
       t1.start(); // 2. 실행
    }
}

 

class MyThread extends Thread {
    public void run() {
        // ...
    }
}