Sleep / Runnable / Target

Jan 29, 2024
Sleep / Runnable / Target

1. Thread.sleep();

notion image
이거 try-catch 하라는 말 (sleep은 도중에 InterruptedException이 발생할 가능성이 있으니 try-catch)
notion image
💡
try-catch를 직접 구현했으니 throws 지워야함…

<Thread.sleep(1000);>

★ Thread.sleep(1000); ★ (1000 = 1초) 스레드를 재울 수 있음. cpu한테 좀 쉬라고 하는 것. cpu가 풀파워로 돌면 인터럽트 (이벤트)를 못함. 풀파워로 도는데ㅠ 어떻게 끼워넣어ㅠ ㅠ sleep을 통해서 10초에 1초라도 멈추면 그 틈 사이로 들어갈수 있으니까. 콘텍트 스위칭을 위해서는 sleep (잠깐 멈추는 타이밍)이 무조건 필요하다!
💡
콘텍트 스위칭 : 연결하거나 끊어주는 작업
 

2. Runnable

notion image
notion image
Runnable은 인터페이스니까 객체로 받으려면 람다식을 사용 Thread 클래스를 상속 받아서 사용할 수도 있음. 그치만 러너블을 구현하는 방법으로 쓰자!

<Runnable>

* 자바에서 스레드(Thread)를 생성하고 실행하기 위해 사용되는 인터페이스 1. Runnable 인터페이스를 사용하여 스레드를 만든다. 2. run() 메서드는 스레드가 실행될 때 호출되는 메서드. (스레드가 수행할 작업을 구현) 3. 생성된 스레드를 start() 메서드를 호출하여 실행한다.
 

 
* Runnable 인터페이스는 run() 메서드를 정의하고 있으며, 이 메서드 안에 스레드가 수행할 작업을 구현한다.
* Runnable 인터페이스를 구현한 클래스는 스레드가 실행될 때 run() 메서드 안에 작성된 코드를 실행하게 된다.
* 이렇게 구현된 Runnable 객체는 Thread 클래스의 생성자에 전달하여 스레드를 생성하고 실행할 수 있다. (★ 스레드는 Runnable 객체를 생성자에 전달하여 만들어지기 때문! ★)
notion image
💡
* Runnable 인터페이스를 사용하면 작업과 스레드를 분리할 수 있다. * Runnable은 작업 단계를 정의하고, 스레드는 해당 작업을 실행하는 역할 이렇게 분리하면 코드의 유지보수가 쉬워지고, 작업 단계를 변경하거나 재사용하기도 편리하다.
 

3. Target

* Runnable 인터페이스를 구현한 객체를 가리킨다. * 메소드를 만드는 것 (sub1()과 sub2() 메소드는 ThreadEx01 클래스에 정의된 메소드)
스레드를 생성하고 실행하기 위해서는 Runnable 인터페이스를 구현한 클래스의 인스턴스를 생성해야 한다. 이 클래스의 인스턴스가 스레드의 타겟이 되며, 스레드의 생명주기는 해당 타겟 객체의 run() 메서드가 실행되는 동안 유지된다. 메소드가 다 실행되면 스레드는 죽음!
 

 
notion image
t1 스레드
 

 
notion image
notion image
💡
타겟 = 무조건 Runneble 타입이어야만 함
 

4. 예제 1 (동시에 ver)

package ex16; public class ThreadEx01 { public static void sub1() { for (int i = 1; i < 6; i++) { try { System.out.println("Start1 thread : " + i); Thread.sleep(1000); } catch (InterruptedException e) { throw new RuntimeException(e); } } } public static void sub2() { for (int i = 1; i < 6; i++) { try { System.out.println("Start2 thread : " + i); Thread.sleep(1000); } catch (InterruptedException e) { throw new RuntimeException(e); } } } //main thread는 run메소드만 호출함 (러너블에 있는 void run()) public static void main(String[] args) { Thread t1 = new Thread(() -> { sub1(); //타겟 }); t1.start(); //운영체제가 run메소드를 때려줌. 콜백. //운영체제한테 start를 요청했는데 애가 run메소드를 때려줌 //실을 만드는 것 - 메인스레드가 실 만듬 Thread t2 = new Thread(() -> { sub2(); //타겟 (run 메소드) }); t2.start(); //실을 시작하는 것 //메인 스레드 종료 (가장 먼저 종료) - sub1, sub2 모두 새로운 스레드가 실행하는거니 //단, 자바는 스레드가 하나라도 살아있으면 종료 안됨! } }
notion image
11, 22, 33, 44, 55 이렇게 두 쌍씩 동시에 딱 뜸
 

5. 예제2 (5초 뒤에 ver)

package ex16; class MyFile { //하드디스크 기록 (I/O) public void write() { try { Thread.sleep(5000); } catch (InterruptedException e) { throw new RuntimeException(e); } System.out.println("파일 쓰기 완료"); } } public class ThreadEx02 { public static void main(String[] args) { MyFile mf = new MyFile(); mf.write(); } }
notion image
......(5초 후) 파일 쓰기 완료 <라고 뜸
 

 
💡
cpu가 여러 개라면 멀티 코어를 활용할 수 있다. (=컨덱트 스위칭 없이 동시에 실행 가능) 멀티 코어는 여러 개의 물리적인 CPU 코어가 하나의 시스템에 내장되어 있는 구조
💡
ex) 게임을 4코어를 쓰게 끔 짜면. 2코어짜리 컴퓨터에서는 안 돌아감. (그걸 해결하기 위해 스레드를 씀. 2개씩 뽑아서 씀 )
1. 왔다갔다하며 사람 눈 속이기 2. I/O 쓸 때 CPU가 멍때리는 시간 없애기 위해서 스레드 사용함
 
 
 
Share article

codingb