본문 바로가기
Programming/Java

[JAVA] 멀티 스레드

by 공부합시다홍아 2024. 2. 26.

멀티스레드 ( Multi Thread )

Multi Tasking(멀티태스킹) 이란 두 가지 작업을 동시에 처리하는 것을 뜻합니다.
한 프로그램 안에서 멀티 태스킹을 동시에 하는 애플리케이션들도 있습니다.

스레드는 프로그램의 실행흐름입니다. 
▶ 프로그램 내에 스레드가 2개라면 두 개의 코드 흐름이 생김을 뜻한다.


스레드의 사용 방법

방법 1.
(1). Runnable Interface를 상속받아 run() 추상메서드를 재정의
(2). Thread 객체의 생성자의 매개값으로 전달
(3). 그 다음 start() 메서드를 통해 실행

방법 2.
(1). Thread 클래스를 상속받아 run() 추상메서드를 재정의
(2). Thread 객체의 생성자의 매개값으로 전달합니다.
(3). 그 다음 start() 메서드를 통해 실행시킵니다.

두 방법의 차이
- Runnable은 인터페이스 이므로, 스레드 실행의 기능만 정의되어 있으므로 클래스내부에서 
  사용할 수 있는 메서드가 한정적입니다. 
- Thread 클래스의 기능을 전부 받아서 사용할 수 있습니다. 

스레드 기본 메서드
start() : 스레드 클래스를 실행
(static) currentThread() : 현재 스레드를 반환
getName() : 스레드 이름 반환
(static) sleep() : 스레드를 잠시 멈춤
yield() : 스레드 실행을 다른 스레드에게 양보
 join() : 해당 스레드를 우선 실행
package api.thread.runable;

public class MainClass {

	public static void main(String[] args) {
		
		//메인도 하나의 쓰레드로 동작을 합니다.
		
		//쓰레드를 동작시키려면 Thread객체를 생성합니다.
		
		//객체 2개, 쓰레드 2개 (각각 실행됨)
		ThreadTest t = new ThreadTest();
		ThreadTest t2 = new ThreadTest();
		
		Thread thread = new Thread(t, "A");
		thread.start();

		Thread thread2 = new Thread(t2, "B");
		thread2.start();
		
		
		
		System.out.println("main쓰레드 종료");
		
		
	}
}
package api.thread.runable;

public class MainClass2 {

	public static void main(String[] args) {
		
		//객체 1개, 쓰레드는 2개 생성
		ThreadTest t = new ThreadTest();
		
		Thread thread = new Thread(t, "A");
		Thread thread2 = new Thread(t, "B");
		
		thread.start();
		thread2.start();
		
		
		System.out.println("main쓰레드 종료");
	}
}
package api.thread.runable;

public class ThreadTest implements Runnable {
	
	int num;
	
	@Override
	public void run() {
		
	
		for(int i = 1; i <= 10; i++) {
			
			Thread t = Thread.currentThread(); //현재동작되는 쓰레드 반환
			if( t.getName().equals("A") ) { //현재 쓰레드의 이름을 받아옴
				num++; //A쓰레드인 경우 num를 올린다
			}
			
			System.out.println("쓰레드이름:" + t.getName() + ", 합계:" + num);
			
			//쓰레드 일시정지
			try {
				Thread.sleep(1000); //1초 일시정지
			} catch (InterruptedException e) {
				e.printStackTrace();
			} 
			
			
		}
		
	}

}

package api.thread.sync;

public class MainClass {

	public static void main(String[] args) {
		
		//동기화 - 한번에 하나의 작업 
		//비동기화 - 한번에 여러개의 작업을 동시에 진행함
		
		ThreadTest t = new ThreadTest();
		
		Thread thread1 = new Thread(t, "A");
		Thread thread2 = new Thread(t, "B");
		
		thread1.start();
		thread2.start();
		
		System.out.println("main스레드 종료");
	}
}
package api.thread.sync;

public class ThreadTest implements Runnable {
	
	int num;
	
	@Override
	public synchronized void run() {
	
		for(int i = 1; i <= 10; i++) {
			
			Thread t = Thread.currentThread(); //현재동작되는 쓰레드 반환
			if( t.getName().equals("A") ) { //현재 쓰레드의 이름을 받아옴
				num++; //A쓰레드인 경우 num를 올린다
			}
			
			System.out.println("쓰레드이름:" + t.getName() + ", 합계:" + num);
			
			//쓰레드 일시정지
			try {
				Thread.sleep(1000); //1초 일시정지
			} catch (InterruptedException e) {
				e.printStackTrace();
			} 
			
			
		}
		
	}

}

동기화 메소드 synchronized

package api.thread.thread;

public class MainClass {

	public static void main(String[] args) {
		
		//Thread객체를 상속 받앗으므로
		ThreadTest t = new ThreadTest();
		t.setName("A"); //쓰레드 이름 지정
		t.start();
		
		
		System.out.println("main스레드 종료");
		
		
	}
}
package api.thread.thread;

//Thread클래스 상속
public class ThreadTest extends Thread {

	int sum;
	
	@Override
	public void run() {
		
		for(int i = 1; i <= 10; i++) {
			
			if(getName().equals("A") ) {
				sum++;
			}
			
			System.out.println("쓰레드이름:" + getName() + ", 합계:" + sum);
			
			try {
				sleep(1000);
			} catch (InterruptedException e) {
				e.printStackTrace();
			}
			
			
			
		}
		
	}

}

 

728x90