JAVA Programming

[84] Thread 란 무엇인가 ?

꾸준히개발하자 2020. 8. 3. 18:27

프로그램이 메모리상태에 올라간 상태가 프로세스

실행되는 단위가 스레드

즉 하나의 프로세스는 하나 이상의 스레드를 가지게 된다.

두개가 동시에 돌아가는 것처럼 보인다.

스레드는 CPU를 점유해서 돌아가게 되는데 CPU를 점유할 수 있는

스케쥴러가 있다. 스케쥴러가 스레드의 CPU를 할당해서 스레드를 수행하도록해줌

 

Thtead 클래스를 상속받아 구현하기 

package thread;

class MyThread extends Thread {

	@Override
	public void run() {
		int i;
		for(i = 0; i < 200; i++) {
			System.out.print(i + "\t");
		}	
		try {
			sleep(1000);  // 깨어나게 한다. 이터럽트 이셉션을 발생 
		} catch (InterruptedException e) {
			System.out.print("오류발생");
		}  
	}
}
public class ThreadTest {
	public static void main(String[] args) {
		System.out.println("Strat");
		MyThread my2 = new MyThread();
		MyThread my1 = new MyThread();
		my1.start(); 
		my2.start();
		System.out.println("end"); // 메인스레드가 먼저 종료 한다. 
	}
}

Runnable 인터페이스를 상속받아 구현하기

 

package thread;

class MyThread2 implements Runnable {

	@Override
	public void run() {
		
		try {
			Thread.sleep(100);  // static 메서드인 Thread를 바로 쓸수 있다.
		} catch (InterruptedException e) { 
			e.printStackTrace();
		}
	}
}
public class ThreadRunnable {

	public static void main(String[] args) {
		System.out.println("Strat");
		
		MyThread mythread = new MyThread();
		MyThread mythread2 = new MyThread();
		// Runnable 클래스를 객체화 한 객체를  Thread 클래스에 넣어준다. 
		
        Thread th1 = new Thread(mythread);
		Thread th2 = new Thread(mythread2);
	
		th1.start();
		th2.start();
		
		System.out.println("end"); // 메인스레드가 먼저 종료 한다. 
	}
}

 

 

두개의 스레드가 동시에 접근하게 되면 값을 가져와서 더하고 값을 빼면

더하려고 가져간 중에 가져가서 뺴버리면되면 오버라이드한 값이 무시되니까

더한 이후로 뺴야되는 문제가 생긴다.

Critical section(임계영역)  대한 순서를 정하자는게 동기화 이다.

Critical section 락을 걸면 다른 스레드가 접근할수없다 .

Synchronizaition 는 메소드에대한 블록방식을 통해 동기화를 지원한다.

서로 공유자원을 가지려고 하는 행위는 race condition 이 발생했다고 한다.