프로그래밍/JAVA

쓰레드 실행제어

Baesj 2021. 9. 26. 20:04

 

sleep()

지정된 시간동안 쓰레드를 멈춘다.

 

class Test_01 implements Runnable {
    @Override
    public void run() {
        for (int i = 0; i < 100; i++) {
            System.out.print("1");
        }
        System.out.println("Runnable 종료");
    }
}
class Test_02 extends Thread {
    public void run() {
        for (int i = 0; i < 100; i++) {
            System.out.print("2");
        }
        System.out.println("Thread 종료");
    }
}
public class ExThreadExControl {
    public static void main(String[] args) {
        Test_01 rb = new Test_01();
        Thread test01 = new Thread(rb);
        Test_02 test02 = new Test_02();
        test01.start();
        test02.start();
        try {
            Thread.sleep(3000); //메인에만 영향을 미친다
        } catch (Exception e) {
            e.printStackTrace();
        }
        System.out.println("메인종료");
    }
}

interrupt()

쓰레드에게 작업을 멈추라고 요청한다. 강제 종료는 아니다.

import java.util.Scanner;

class Test_In_01 extends Thread{
    @Override
    public void run() {
        int i = 1;
        while (!isInterrupted()) {
            System.out.println(i++);
            for (long j = 0; j < 2000000000L; j++);
        }
        System.out.println("쓰레드 종료");
    }
}

public class ExThreadInterrupt {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);

        Test_In_01 test01 = new Test_In_01();
        test01.start();

        System.out.println("값 입력");
        int a = sc.nextInt();
        System.out.println("입력 값 = " + a);
        test01.interrupt();
        System.out.println("메인 종료");
    }
}

 

join()

다른 쓰레드의 작업을 기다림

class Test_join_01 implements Runnable {
    @Override
    public void run() {
        for (int i = 0; i < 200; i++) {
            System.out.print("R");
        }
        System.out.println("Runnable 종료");
    }
}
class Test_join_02 extends Thread {
    @Override
    public void run() {
        for (int i = 0; i < 200; i++) {
            System.out.print("T");
        }
        System.out.println("Thread 종료");
    }
}

public class ExThreadJoin {
    public static void main(String[] args) {
        Test_join_01 rb = new Test_join_01();
        Thread test1 = new Thread(rb);
        Test_join_02 test2 = new Test_join_02();
        test1.start();
        test2.start();
        try { //메인쓰레드가 test1과 test2의 작업이 끝날 때까지 기다림
            test1.join();
            test2.join();
        } catch (Exception e) {
            e.printStackTrace();
        }
        System.out.println("메인종료");
    }
}

yield()

다른 쓰레드에게 양보한다

class Test_Y_01 implements Runnable {

    @Override
    public void run() {
        for (int i = 0; i < 50; i++) {
            System.out.print("R");
        }
    }
}
class Test_Y_02 extends Thread {
    public boolean work = true;
    @Override
    public void run() {
        for (int i = 0; i < 50; i++) {
            if (!work) {
                Thread.yield();
            }
            System.out.print("T");
        }
    }
}
public class ExThreadYield {
    public static void main(String[] args) {
        Test_Y_01 rb = new Test_Y_01();
        Thread test01 = new Thread(rb);
        Test_Y_02 test02 = new Test_Y_02();
        test02.start();
        test01.start();
        test02.work = false;
//        test02.work = true;
        System.out.print("메인종료");
    }
}

 

suspend()

쓰레드 정지

resume()

suspend()로 정지된 쓰레드를 실행대기로 만듬

stop()

쓰레드 종료

 

위 3개는 deprecated 이므로 사용하지 말자

 

'프로그래밍 > JAVA' 카테고리의 다른 글

쓰레드 wait()과 notify()  (0) 2021.09.29
쓰레드의 동기화  (0) 2021.09.27
쓰레드 상태 및 과정  (0) 2021.09.24
쓰레드 IO블락킹과 데몬쓰레드  (0) 2021.09.23
프로세스와 쓰레드(이해와 구현)  (0) 2021.09.19