Language/JAVA

[JAVA 기초 이론] 스레드 Thread

오류나면꽥꽥 2023. 5. 22. 10:59

스레드

 

  • 프로그램 실행의 기본 단위로, 하나의 프로세스 내에서 독립적으로 실행될 수 있는 흐름
  • 프로세스 내에서 각각의 독립적인 작업을 수행하며, 여러 스레드가 동시에 실행
  • 여러 작업을 병렬로 실행하거나, 프로그램의 반응성을 높이는 등의 다양한 목적으로 활용
  • 이미 JAVA에서 구현한 Thread 클래스를 가져다가 사용

 

 

 

 

📍 스레드 생명주기

스레드 객체가 생성이 되면, 즉시 대기 →  수행   데드

 

ex)

Th01 t1 = new Th01();     대기   start() ... run()   데드

start()  스레드 객체야, 일해! -> run()메서드를 실행시켜 수행하게 됨

 

 

 

 

 

📌 Thread 구현 방법

 

  1. 스레드 상속
    class 클래스명 extends Thread{
        @Override
        // run() 필수로 생성 : main()에서 start() 시 run 안에 넣은 메서드가 실행
    }​
  2. 스레드 상속 받은 클래스 객체화 
    클래스명 변수명 = new 클래스명();   생성

  3. 변수명.start();
    수행하고 완료되면 데드 상태가 된다.

 

 

 

ex)

package class01;

class Th01 extends Thread{ // 스래드 기본 생성자가 있다
    @Override
    public void run() {
        for(int i=0;i<=10;i++) {
            System.out.println("Thread 01 "+i);
        }
    }
}

class Th02 extends Thread{
    @Override
    public void run() {
        for(int i=0;i<=10;i++) {
            System.out.println("Thread 02 "+i);
        }
    }
}

public class Test01 {
    public static void main(String[] args) {
        
        // 생성
        Th01 t1=new Th01();
        // 생성이 되면, 즉시 대기상태가 됨
        Th02 t2=new Th02();

        // 수행
        t1.start(); // 스레드 객체야, 일해!
        t2.start(); // -> run()메서드를 실행시킴

        // start()로 인해 run()을 수행하게 되고,
        // 주어진 run()을 수행하게 되면
        // => 데드 상태가 됨

        // 스레드 객체들은 현재 독립적으로 일을 수행하고 있구나!

        // 스레드 생명주기(라이프사이클)
        // 생성 -> 대기 -> 수행 -> 데드
        // 블록 : 자원(메모리)을 할당 받지 못하도록 막아둔 상태

        for(int i=0;i<=10;i++) {
            System.out.println(i); // 1000 == 1초
            try {
                Thread.sleep(1000);
            } catch (InterruptedException e) {
                e.printStackTrace();
            } 
        }
    }
}

 

 

 

 

 

 

 

 

 

✅ synchronized : 동기화

 

  • 내가 사용하는 동안 접근하지마
  • 메서드 앞에 붙여주면 동기화 기능

 

synchronized void 메서드명(){
	Thread.currentThread().get() // 스레드로 객체 생성 시 스레드 객체에 있는 이름을 받아옴
}

 

ex) 주로 은행, 영화관, 티켓판매 하는 곳에서 사용하는 기능

      누군가가 먼저 영화관 자리를 구매중일 때는 다른 사람이 구매하지 못하도록 막혀있다.

 

 

 

 

 

 

ex)

package class01;

class Family extends Thread{
	Account a=new Account();

	@Override
	public void run() {
		a.use();
	}
}

class Account{
	static int money=10000; // 공유자원 돈
	synchronized void use() { // 동기화 : 내가 쓰는 동안은 접근하지마
		if(money>=5000) {
			System.out.println(Thread.currentThread().getName()+" 인출성공!");
			// 스레드가 멤버변수로 이름을 갖고 있다
			// 스레드 객체에 있는 이름을 받아옴
			
			/*
			 class Thread{
			 	private String name;
			 	Thread(){
   					this(new Thread(),null);
 				}
			 	Thread(Thread thread,String name){
			 		this.name=name;
			 	}
			 	getter,setter{
			 	}
			 
			 */
			money-=5000;
		}
		else {
			System.out.println(Thread.currentThread().getName()+" 인출실패..");
		}
		System.out.println("남은 돈: "+money);
		
	}
}

public class Test03 {
	public static void main(String[] args) {
		Family f=new Family();
		Thread t1=new Thread(f,"엄마");
		Thread t2=new Thread(f,"아빠");
		Thread t3=new Thread(f,"나");
		
		t1.start();
		t2.start();
		t3.start();

	}
}