쓰레드

프로그래밍/Java 2020. 5. 10. 13:47

쓰레드란 하나의 '프로세스'를 의미한다. 즉 실행중인 프로그램을 프로세스라고 하고, 그 안에서 프로그램이 동작하려면 쓰레드가 필요하다. 쓰레드를 할당하려면 반드시 메모리가 할당 되어야 한다.

 

쓰레드 생성

package com.github.dongpani.자바의정석;

class Ex13_1 {
    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 {
    public void run() {
        for(int i=0; i < 5; i++) {
            System.out.println(getName()); // 조상인 Thread의 getName()을 호출
        }
    }
}

class ThreadEx1_2 implements Runnable {
    public void run() {
        for(int i=0; i < 5; i++) {
            // Thread.currentThread() - 현재 실행중인 Thread를 반환한다.
            System.out.println(Thread.currentThread().getName());
        }
    }
}
  • 쓰레드를 생성하는 방법은 Thread 클래스를 상속 받거나, Runnable 인터페이스를 구현하거나 둘 중에 하나이다.

실행결과

 

 

 

동기식 쓰레드

package com.github.dongpani.자바의정석;

public class Ex13_2 {
    public static void main(String[] args) {
        // 현재시간
        long startTime = System.currentTimeMillis();

        for(int i=0; i<300; i++)
            System.out.printf("%s", new String("-"));

        System.out.print("소요시간1:" + (System.currentTimeMillis() - startTime));

        for(int i=0; i<300; i++)
            System.out.printf("%s", new String("|"));

        System.out.print("소요시간2:" + (System.currentTimeMillis() - startTime));

        /**
         * 하나의 쓰레드가 끝난 후 바로 다음 쓰레드를 생성함.
         */

    }
}
  • 하나의 작업이 끝나고 다음 작업을 수행한다.
  • 소요시간1 -> 소요시간2 순서로 출력됨.

 

 

멀티쓰레드

package com.github.dongpani.자바의정석;

public class Ex13_3 {
    static long startTime = 0;

    public static void main(String[] args) {
        ThreadEx3_1 th1 = new ThreadEx3_1();
        th1.start(); // 쓰레드 시작 후 기다리지 않음.
        startTime = System.currentTimeMillis();

        for (int i = 0; i < 300 ; i++)
            System.out.printf("%s", new String("-"));

        System.out.print("소요시간1: " + (System.currentTimeMillis() - Ex13_3.startTime));

    }
}

class ThreadEx3_1 extends Thread {
    public void run() {
        for(int i=0; i<300; i++)
            System.out.printf("%s", new String("|"));

        System.out.print("소요시간2: " + (System.currentTimeMillis() - Ex13_3.startTime));

    }
}
  • 두 개의 쓰레드에서 같은 반복문을 수행.
  • 동시에 작업을 수행하므로 작업 순서를 보장하지 않는다.
  • (소요시간1, 소요시간2) 가 실행할 때 마다 순서가 다를 수 있음.

 

 

I/O블락킹

사용자 입력을 대기한 후 작업실행

 

싱글쓰레드

package com.github.dongpani.자바의정석;

import javax.swing.*;

public class Ex13_4 {
    public static void main(String[] args) throws Exception{
        String input = JOptionPane.showInputDialog("아무 값이나 입력하세요.");
        System.out.println("입력하신 값은 " + input + "입니다.");

        // 카운트 다운
        for(int i=10; i > 0; i--) {
            System.out.println(i);
            try{
                Thread.sleep(1000);
            }catch(Exception e) {}
        }

    }
}

 

실행결과

 

 

멀티쓰레드

package com.github.dongpani.자바의정석;

import javax.swing.*;

public class Ex13_5 {
    public static void main(String[] args) throws Exception{
        ThreadEx5_1 th1 = new ThreadEx5_1();
        th1.start();

        String input = JOptionPane.showInputDialog("아무 값이나 입력하세요.");
        System.out.println("입력하신 값은 " + input + "입니다.");
    }
}

class ThreadEx5_1 extends Thread {
    public void run() {
        for(int i=10; i>0; i--) {
            System.out.println(i);
            try{
                sleep(1000);
            }catch (Exception e) {}
        }
    }
}
  • 위 예제외 같은 코딩을 쓰레드를 두 개로 나누어 처리했다.
  • 순서가 보장되지 않는다. 먼저 th1인스턴스가 실행되는 도중 input 값이 들어오면 출력한다.

 

출처: 자바의 정석

 

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

Iterator를 사용 list의 객체 삭제하기  (0) 2021.11.02
스트림(파일)  (0) 2020.01.04
예외처리  (0) 2019.12.29
스트림  (0) 2019.12.27
람다식  (0) 2019.12.25
블로그 이미지

파니동

,