본문 바로가기
2022-2/자바

[자바] 스레드와 멀티태스킹

by 철없는민물장어 2022. 12. 18.
728x90
반응형

자바에서 스레드 만들기

  • java.lang.Thread 클래스를 이용하는 방법
  • java.lang.Runnable 인터페이스를 이용하는 방법

Thread 클래스를 이용한 스레드 생성
class MyThread extends Thread{

	@Override
    public void run(){
    	...//run 오버라이딩
    }	
}

run()메소드를 스레드 코드라고 부름.

run()메소드에서 스레드 실행 시작

 

MyThread mythread= new MyThread();

mythread.start();

스레드 객체를 생성하고,

start() 메소드를 호출하여 스레드를 시작할 수 있다.


Runnable 인터페이스로 스레드 만들기
class MyThread implements Runnable{
	
    @Override
    public void run(){
    	... //run()메소드 구현
    }
}
Thread mythread = new Thread(new MyThread());
mythread.start();

이 방법으로 만든 스레드는

스레드객체 생성시 Thread생성자의 인자로 내가만든 클래스 객체를 넣어줘야 함

 


스레드 동기화(Thread Synchronization)

 

멀티스레드 프로그램 작성 시,

다수 스레드가 공유 데이터에 동시에 접근하는 경우 예상치 못한 결과가 발생할 수 있다.

 

이 문제를 해결하기 위해 스레드 동기화를 사용할 수 있다.

(한 스레드가 공유 데이터에 대한 작업을 끝낼 때까지 다른 스레드가 대기하도록 함)

 

자바에서 스레드 동기화 방법

  • synchronized로 동기화 블록 지정
  • wait() - notify() 메소드로 스레드 실행 순서 제어

synchronized

한 스레드가 독점 실행해야 하는 부분(동기화 코드)을 표시.

 

synchronized블록에 대한 컴파일러의 처리

  • 먼저 실행한 스레드가 모니터(독점적으로 사용할 권한) 소유
  • 모니터를 소유한 스레드가 모니터를 내놓을 때까지 다른 스레드는 대기

 

synchronized 코드 블록을 작성

void execute()
{
	..
    synchronized(this)
    {
    	int n=getCurrentSum();
        n+=10;
        setCurrentSum(n);
    }
    ...
}

 

synchronized 메소드를 작성할 수도 있다.

synchronized void add(){
	int n=getCurrentSum();
    n+=10;
    setCurrentSum(n);
}

 


wait() notify()

wait() : 다른 스레드가 notify()를 불러줄 때까지 기다린다.

notify(): wati()을 호출하여 대기중인 스레드를 깨우고 RUNNABLE상태로 만든다.(두개 이상이 있어도 한 스레드만 깨움)

notify(): wait()을 호출하여 대기중인 스레드를 모두 깨운다.

 

 

728x90
반응형

'2022-2 > 자바' 카테고리의 다른 글

[자바] 인터페이스  (0) 2022.12.18
[자바] 제네릭과 컬렉션  (0) 2022.12.18
[자바] 네트워크  (0) 2022.12.17
[자바] ArrayList<클래스> 형의 정렬방법  (0) 2022.12.12
[자바] 멀티스레드, synchronized  (0) 2022.12.01

댓글