본문 바로가기
Java/Java 인강

Java 인강 필기 13

by code2772 2022. 10. 2.

[ 목차 ]

    728x90
    반응형
    (22.8.7)
    
    # 43강 스레드2
    
    ​
    
    - 스레드 우선수위 - 스레드는 시분할 방식으로 CPU의 시간을 분배하여 실행하지만
    
    사용자가 직접 스레드의 우선순위를 지정해서 특정 스레드에 더 많은 실행시간 부여 가능
    
    ​
    
    - 스레드 라이프사이클 - 스레드는 현재 상태에 따라 네 가지 상태로 분류할 수 있으며,
    
    상태가 변화하는 주기를 Life Cycle 이라고 한다
    
    ​
    
    - < 스레드 상태 >
    
    ​
    
    - new -
    
    스레드가 키워드 new를 통해서 인스턴스 화된 상태
    
    Runnable이 될 수 있는 상태이며 아직 대기열에 올라가지 못한 상태
    
    - Runnable -
    
    start( ) 메서드가 호출되면 new 상태에서 Runnable 상태가 된다.
    
    Runnable 상태가 되면 실행할 수 있는 상태로 대기하게 되며 스케줄러에 의해
    
    선택되면 run( )메서드를 바로 수행
    
    Blocked 실행 중인 스레드가 sleep( ), join( ) 메서드를 호출하게 되면, Blocked 상태가 된다.
    
    - Blocked - 상태가 되면 스케줄러에 의해서 선택받을 수 없다.
    
    - Dead - run( )메서드의 실행을 모두 완료하게 되면 스레드는 Dead 상태가 된다.
    
    할당받은 메모리와 정보 모두 삭제된다
    
    ​
    
    - sleep( )
    
    : 스레드를 지정한 시간 동안 block 상태로 만든다
    
    시간은 1000분의 1초 까지 지정할 수 있으며, 지정된 시간이 지나면 다시 runnable (실행 가능한)상태로 돌아간다
    
    ​
    
    package day43;
    
    ​
    
    public class Sleep2 {
    
    ​
    
    public static void main(String[] args) {
    
    SleepThread t= new SleepThread();
    
    t.start();
    
    }
    
    }
    
    ​
    
    class SleepThread extends Thread {
    
    public void run() {
    
    System.out.println("카운트 다운 5초");
    
    for(int i=5;i>=0;i--) {
    
    System.out.println(i);
    
    if(i!=0) {
    
    try{
    
    Thread.sleep(1000); //1초동안 스레드 block
    
    }
    
    catch(InterruptedException e) {
    
    System.out.println(e.toString());
    
    }
    
    }
    
    }
    
    System.out.println("종료");
    
    }
    
    }
    
    ​
    
    ​
    
    ​
    
    ​
    
    ​
    
    - yield( )
    
    : 자신의 시간을 양보하는 메서드.
    
    스레드가 작업을 수행하던 중 yield( )를 만나면, 자신에게 할당된 시간을 다음 차례 스레드에게 양도
    
    ​
    
    package day43;
    
    //★
    
    public class Yield1 {
    
    ​
    
    public static void main(String[] args) {
    
    MyThread6 s1= new MyThread6();
    
    MyThread7 s2= new MyThread7();
    
    ​
    
    Thread t1=new Thread(s1);
    
    Thread t2=new Thread(s2);
    
    ​
    
    t1.start();
    
    t2
    
    .start();
    
    }
    
    }
    
    class MyThread6 implements Runnable{
    
    @Override
    
    public void run() {
    
    for(int i=0;i<30;i++) {
    
    System.out.print("★");
    
    Thread.yield(); //자신에게 주어진 시간 양보
    
    }
    
    }
    
    }
    
    class MyThread7 implements Runnable{
    
    @Override
    
    public void run() {
    
    for(int i=0;i<30;i++) {
    
    System.out.print("☆");
    
    }
    
    }
    
    ​
    
    }
    
    ​
    
    ​
    
    ​
    
    ​
    
    - join( ) : 특정한 스레드가 작업을 먼저 수행할때 사용 실행 순서를 지켜야 하는 스레드들을 제어한다
    
    ​
    
    package day43;
    
    ​
    
    public class Join1 {
    
    ​
    
    public static void main(String[] args) {
    
    MyThread8 s1 = new MyThread8();
    
    MyThread9 s2 = new MyThread9();
    
    ​
    
    Thread t1 = new Thread(s1);
    
    Thread t2 = new Thread(s2);
    
    t1.start();
    
    ​
    
    try {
    
    t1.join();// t1를 제외한 다른 스레드 (lock), t1이 완료될때까지 기다림
    
    } catch (InterruptedException e) {
    
    System.out.println(e.toString());
    
    }
    
    t2.start();
    
    try {
    
    t2.join();// t2를 제외한 다른 스레드 (lock), t2이 완료될때까지 기다림
    
    } catch (InterruptedException e) {
    
    System.out.println(e.toString());
    
    }
    
    for(int i=0;i<10;i++) {
    
    System.out.println("main : "+i);
    
    }
    
    }
    
    }
    
    ​
    
    class MyThread8 implements Runnable {
    
    @Override
    
    public void run() {
    
    for (int i = 0; i < 10; i++) {
    
    System.out.println("t1 : " + i);
    
    }
    
    System.out.println("<<t1 완료>>");
    
    }
    
    }
    
    ​
    
    class MyThread9 implements Runnable {
    
    @Override
    
    public void run() {
    
    for (int i = 0; i < 10; i++) {
    
    System.out.println("t2 : " + i);
    
    }
    
    System.out.println("<<t2 완료>>");
    
    }
    
    }
    
    ​
    
    ​
    
    # 44강 스레드3
    
    ​
    
    - 스레드의 동기화
    
    : 멀티 스레드로 작업 시, 스레드 간 작업이 서로 간섭이 되지 않도록 하는 것
    
    멀티 스레드의 문제점?
    
    멀티 스레드 기법은 자원을 공유하는데, 이 때 동시에 같은 자원을 처리한다면,
    
    자원 값이 실제 처리 해야 하는 작업보다 더 많은 작업이 발생할 수 있다.
    
    ​
    
    ​
    
    - wait( ) 와 notify( )
    
    스레드를 대기시키는 wait( )메서드와 대기중인 스레드를 깨우는 notify( )메서드를
    
    통한 스레드 제어 알아보기
    
    ​
    
    ​
    반응형

    'Java > Java 인강' 카테고리의 다른 글

    Java 인강 필기 15  (0) 2022.10.02
    Java 인강 필기 14  (0) 2022.10.02
    Java 인강 필기 12  (1) 2022.10.02
    Java 인강 필기 11  (0) 2022.10.02
    Java 인강 필기 10  (1) 2022.10.02