프로그램이 메모리상태에 올라간 상태가 프로세스
실행되는 단위가 스레드
즉 하나의 프로세스는 하나 이상의 스레드를 가지게 된다.
두개가 동시에 돌아가는 것처럼 보인다.
스레드는 CPU를 점유해서 돌아가게 되는데 CPU를 점유할 수 있는
스케쥴러가 있다. 스케쥴러가 스레드의 CPU를 할당해서 스레드를 수행하도록해줌
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"); // 메인스레드가 먼저 종료 한다.
}
}
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 이 발생했다고 한다.
'JAVA Programming' 카테고리의 다른 글
[86] Thread 종료하기 . boolean 으로 while문 true 시 인터럽트발생 (0) | 2020.08.03 |
---|---|
[85] Thread 멀티 기타메소드CurrentThread() , wait() , join() , (0) | 2020.08.03 |
[83] 바이트 단위 입출력 시스템 (0) | 2020.07.21 |
[82] Scanner , Console 클래스 (0) | 2020.07.21 |
[80] I/O 입출력 스트림 정의 (0) | 2020.07.21 |