스레드(Thread)

Jan 04, 2024
스레드(Thread)
 
💡
실이라는 의미로 하나의 실행 흐름이다. CPU는 하나의 스레드를 갖고 있는데, 다중 작업을 위해서는 하나의 스레드가 멀티테스킹을 수행한다. 이렇게 되면 CPU의 작업 시간을 쪼개어 작업이 수행되기 때문에 느려지지만, 사람이 보기에는 동시에 수행되는 것 처럼 보인다. 이것을 멀티 스레딩(Multi -threading) 이라고 한다.
 
 
notion image
자바 프로그램이 실행되면 CPU는 메인 스레드가 되어 메인 클래스를 관리한다.
1번 부터 순서대로 처리되는데 3번은 작업 속도가 오래 걸린다고 가정을 하면, 3번의 처리가 끝나기 전까지는 4, 5번은 기다릴 수 밖에 없다.
 
notion image
 
따라서 작업시간이 오래 걸리는 일을 처리할 때는 새로은 스레드를 만들어서 번갈아가며 작업을 수행하게 된다.
 
 

컨텍스트 스위칭(Context switch)

 
💡
CPU가 처리하는 하나의 프로세스에서 다른 프로세스로 넘기는 것.
Thread.sleep(시간m/s);
 
위의 코드를 넣으면 해당 시간동안 작업이 잠시 중단된다. 시간에 1000m/s 가 1초이다.
Thread.sleep 은 예외처리가 강제되어 있기 때문에 try-catch 를 사용해야 한다.
 
public class Thread1 { public void sub1() { for (int i = 0; i < 5; i++) { try { System.out.println("Start1 thread:" + i); Thread.sleep(1000); } catch (Exception e) { throw new RuntimeException(e); } } } public static void main(String[] args) { Thread1 t1 = new Thread1(); t1.sub1(); } }
 
실행하면 1초마다 하나씩 값을 출력한다.
 

스레드의 동기 vs 비동기

 
💡
스레드의 동기식은 순서대로 업무처리를 하는 것 , 비동기식은 빨리 처리할 수 있는 것을 먼저 처리하는 방식이다.
 
예를 들어 카페에서 주문을 한다고 생각해보자.
 
한 사람이 음료를 20잔 주문했다. 순차적으로 처리한다면 20잔의 음료를 다 만든 후 다음 사람의 주문을 받아 처리하게 된다. 이것은 아주 비효율적이다.
효율적으로 처리하려면 우선 모든 고객의 주문을 받아 순서표를 주는 것이다. 순서표를 받은 고객은 기다리지 않고 다른 일을 할 수 있기 때문이다. 이렇게 빨리 처리할 수 있는 일을 먼저 하는 것이 비동기식 방식이다.
 
 
public class Thread3 { public void sub1() { try { Thread.sleep(5000); System.out.println("프로그램 구동"); } catch (Exception e) { throw new RuntimeException(e); } } public void sub2() { try { Thread.sleep(1000); System.out.println("기본 화면 표시"); } catch (InterruptedException e) { throw new RuntimeException(e); } } public static void main(String[] args) { Thread3 t1 = new Thread3(); t1.sub1(); Thread3 t2 = new Thread3(); t2.sub2(); } }
 
프로그램이 실행되는 것을 상상하며 코드를 만들었다. 우선 프로그램이 실행되면 프로그램이 구동되기 이전에 기본 화면에서 대기를 하다가 실제 프로그램이 구동된다.
하지만 위의 코드로 실행하면 순차적으로 실행되기 때문에 5초 이후에 프로그램 구동이 출력되고, 또 1초 이후에 기본 화면이 표시된다.
 
비동기식으로 빨리 끝나는 작업 부터 처리하자.
 
 
public class Thread3 { public void sub1() { try { Thread.sleep(5000); System.out.println("프로그램 구동"); } catch (Exception e) { throw new RuntimeException(e); } } public void sub2() { try { Thread.sleep(1000); System.out.println("기본 화면 표시"); } catch (InterruptedException e) { throw new RuntimeException(e); } } public static void main(String[] args) { Thread3 t = new Thread3(); Thread thread1 = new Thread(() -> { t.sub1(); }); thread1.start(); Thread thread2 = new Thread(() -> { t.sub2(); }); thread2.start(); } }
notion image
Share article

{CODE-RYU};