[JAVA]쓰레드

진섭·2023년 5월 11일
0
post-thumbnail

쓰레드

자바의 정석 책과 안드로이드 앱스쿨에서 공부한 내용을 정리한 내용입니다.

 

프로세스와 쓰레드

  • 프로세스 : 실행 중인 프로그램, 자원(메모리, CPU)과 쓰레드로 구성
  • 쓰레드 : 프로세스 내에서 실제 작업을 수행. 모든 프로세스는 최소한 하나의 쓰레드를 가진다.

프로세스 : 쓰레드 = 공장 : 일꾼에 비유할 수 있어요

  • 싱글 쓰레드 프로세스 = 자원 + 쓰레드
  • 멀티 쓰레드 프로세스 = 자원 + 쓰레드 + 쓰레드 + ... + 쓰레드

우리가 쓰는 프로그램은 대부분 멀티 쓰레드 방식을 쓰고 있다.

멀티쓰레드의 장단점

  • 장점

    • 시스템 자원을 보다 효율적으로 사용할 수 있다.
    • 사용자에 대한 응답성이 향상된다.
    • 작업이 분리되어 코드가 간결해 진다.
  • 단점
    + 동기화에 주의해야 한다.
    + 교착상태가 발생하지 않도록 주의해야 한다.
    + 각 쓰레드가 효율적으로 고르게 실행될 수 있게 해야 한다.

 

쓰레드의 구현과 실행

  1. Thread클래스를 상속
class MyThread extends Thread{
	public void run(){

	}
}
2. Runnable 인터페이스를 구현
class MyThread2 implements Runnable{
	public void run(){

	}
}
 //Thread클래스를 상속받을 때 사용법
MyThread t1 = new MyThread(); // 쓰레드의 생성
t1.start();//쓰레드의 실행

//Runnable인터페이스의 구현
Runnable r = new MyThread2();
Thread t2 = new Thread(r);
r2.start();

여기서 알 수 있는 내용이 start()를 사용하면 쓰레드를 실행 시킬 수 있습니다.

Sleep()

현재 쓰레드를 지정된 시간동안 멈추게 한다.

try{
	Thread.sleep(1,5000000);//쓰레드를 0.0015초를 멈추게한다.
}catch(InterruptedException e){}

interrupt()

대기상태인 쓰레드를 실행대기 상태로 만든다.

{
	ThreadEx13_2 th1 = new ThreadEx13_2();
	th1.start();

	th1.interrupt();
	
	System.out.println(th1.isInterrupted);
}

 

suspend(), resume(),stop()

void suspend() // 쓰레드를 일시정지 시킨다.
void resume() // suspend()에 의해 일시정지된 쓰레드를 실행대기 상태로 만든다.
void stop()// 쓰레드를 즉시 종료시킨다.

 

join()

지정된 시간동안 특정 쓰레드가 적업하는 것을 기다린다.

void join() // 작업이 모두 끝날 때까지
void join(long millis) // 천분의 일초동안
void join(long millis, int nanos) //천분의 일초 +나노초 동안

 

yield()

남은 시간을 다음 쓰레드에게 양보하고 , 자신은 실행대기한다.

 

쓰레드의 동기화

  • 멀티 쓰레드 프로세스에서는 다른 쓰레드의 작업에 영향을 미친다.
  • 진행중인 작업이 다른 쓰레드에게 간섭받지 않게 하려면 동기화가 필요하다.

쓰레드의 동기화란? 한 쓰레드가 진행중인 작업을 다른 쓰레드가 간섭하지 못하게 막는 것

  • 동기화하려면 간섭받지 않아야 하는 문장들을 임계영역으로 설정한다.
  • 임계영역은 락을 얻은 단 한나의 쓰레드만 출입 가능 객체 1개에 락 1개

synchronized를 이용한 동기화

synchronized로 임계영역을 설정하는 방법 2가지

// 메서드 전체를 임계 영역으로 지정
public synchronized void calcsum(){

}

// 특정한 영역을 임계 영역으로 지정
synchronized(객체의 참조변수){

}

 

wait()과 notify()

  • 동기화의 효율을 높이기 위해 wait() -> 기다리기 , notify() ->통보 , 알려주기 를 사용한다.
  • Object클래스에 정의되어 있으며 동기화 블록 내에서만 사용할 수 있다.
  • wait() - 객체의 lock을 풀고 쓰레드를 해당 객체의 waiting pool에 넣는다.
  • notify() - waiting pool에서 대기중인 쓰레드 중의 하나를 깨운다.
  • notifyAll() -waiting pool에서 대기중인 모든 쓰레드를 깨운다.

0개의 댓글