웹개발/JAVA개념

JAVA 13 (스레드)

스레드란?

프로세스는 프로그램의 실행 단위이고 프로세스를 구성하는 작업단위를 스레드라고 한다.

스레드는 경량 프로세스라고도 불리는데 이유는 프로세스의 공통 Resource를 공유하기 때문이다.

 

 

Thread 상속법

class ThreadClass extends Thread {
	ThreadClass(){
		start();
	}
	
	//오버라이딩 
	public void run(){
		while(true){
			System.out.println("Sub Thread");
			try{
				Thread.sleep(1000); //스레드를 일시 중시(1초동안)
			}catch(Exception e){}
		}
	}
	
	void method(){
		while(true){
			System.out.println("Main Thread");
			try{
				Thread.sleep(1000); //스레드를 일시 중시(1초동안)
			}catch(Exception e){}
		}
	}
	
	public static void main(String[] args) {
		ThreadClass t = new ThreadClass();
		t.method();
	}
}

ThreadClass 실행화면(무한반복)

 

 

Runnable 상속법

class RunnableClass implements Runnable {
	
	RunnableClass(){
		Runnable r = this;
		Thread th = new Thread(r);
		th.start();
	}
    
	//오버라이딩 
	public void run(){
		while(true){
			System.out.println("Sub Thread by Runnable");
			try{
				Thread.sleep(1000);
			}catch(Exception e){}
		}
	}
	
	void method(){
		while(true){
			System.out.println("Main Thread");
			try{
				Thread.sleep(1000);
			}catch(Exception e){}
		}
	}
    
	public static void main(String[] args) {
		RunnableClass r = new RunnableClass();
		r.method();
	}
}

RunnableClass 실행화면(무한반복)

 

 

MultiThread

class Thread01 implements Runnable{
	
	public void run() {
		while(true) {
			System.out.println("Thread01");
			try {
				Thread.sleep(1000);
			}catch(InterruptedException ie){}
		}
	}
}

class Thread02 extends Thread {
	
	public void run() {
		while(true) {
			System.out.println("Thread02");
			try {
				Thread.sleep(1500);
			}catch(InterruptedException ie){}
		}
	}
}

class MultiThread {
	
	MultiThread() throws InterruptedException {
		new Thread(new Thread01()).start();
		new Thread02().start();
		
		play();
	}
	
	void play() throws InterruptedException {
		while(true) {
			System.out.println("MultiThread");
			Thread.sleep(3000);
		}
	}
	
	public static void main(String[] args) throws InterruptedException{
		new MultiThread();
	}
	
}

MultiThread 실행화면(무한반복)

 

 

Join() 사용

join()을 사용하면 해당 스레드가 종료되기를 기다렸다가 다음으로 넘어감

class ThreadEx01 extends Thread {
	
	ThreadEx01(){
        this.start();
		try{
			join(); //join사용 시 해당 스레드가 종료되기 전 까지 기다렸다가 다음으로 넘어감~
		}catch(InterruptedException ie){} //main쓰레드가 멈춤
	}
	
	public void run(){
		for(int i=0; i<3; i++){
			System.out.println("자식 쓰레드가 일을 한다");
			try{
				Thread.sleep(500);
			}catch(InterruptedException ie){}
		}
		System.out.println("자식 쓰레드가 죽었다");
	}
	
	public static void main(String[] args) {
		new ThreadEx01();
		System.out.println("메인 쓰레드가 죽었다");
	}
}

join() 사용 예제

 

 

Priority

Ready 상태의 스레드 중에서 우선적으로 CPU를 점유할 수 있는 스레드를 판별하기 위한 LEVEL 값 (범위 1 ~ 10)

범위가 클수록 우선순위가 높으며 우선순위는 상대적인것이다.

따라서 Thread1보다 Thread2가 더 빨리 끝날 가능성이 높다.

스레드에 기본값은 5이다(main에서 기본값 상속받음)

class PriorityEx {
	
	public static void main(String[] args) {
		//System.out.println("max : " + Thread.MAX_PRIORITY); //10
		//System.out.println("min : " + Thread.MIN_PRIORITY); //1
		//System.out.println("nor : " + Thread.NORM_PRIORITY); //5
		
		Thread1 t1 = new Thread1();
		Thread2 t2 = new Thread2();
		
		t1.setPriority(1);
		t2.setPriority(10);
		
		t1.start();
		t2.start();
	}
}

class Thread1 extends Thread {
	public void run() {
		int total = 0;
		for(int i = 0; i <= 500; i++) {
			System.out.print("1");
		}
		System.out.println("Thread1 작업완료");
	}
	
}

class Thread2 extends Thread {
	public void run() {
		int total = 0;
		for(int i = 0; i <= 500; i++) {
			System.out.print("2");
		}
		System.out.println("Thread2 작업완료");
	}
}

 

 

동기화

하나 이상의 스레드가 어떤 연산 또는 로직에 동시에 접근할 때 그연산의 무결성을 보장하기 위해 수행영역에 대한 lock을 걸어주는것(화장실 문고리 같은 역할을 함)

ex1) synchronized void m(){ 동기화 필요한 로직; }

ex2) synchronized(this) { 동기화 필요한 로직; }

class SyncClass extends Thread {
	int i = 0; 
	
	SyncClass(){
		new Thread(this).start();
		m1();
	}
	
	synchronized void m1(){
		for(int j = 0; j <100; j++) {
			i++;
			System.out.println("메인 : " + i);
		}
	}
	
	void m2(){
		synchronized(this){ //자신
			i++;
		}
		System.out.println("서브 : " + i);
	}
	public void run(){
		m2();
	}
	
	public static void main(String[] args) {
		new SyncClass();
	}
}