동기 : 작업을 순차적으로 처리하는 것을 의미한다.
비동기 : 동시에 여러 작업을 처리하는 것을 의미한다.
동기적인 작업 다수를 비동기적으로 처리하게 된다.
Thread : 자바에서 비동기 처리를 지원하기 위해 제공하는 클래스
한마디로 동시에 여러 개의 작업을 하고 싶을 때 사용하는 개념이다.
오류가 발생할 가능성이 높은 작업의 경우 별도의 쓰래드로 운영하면 안정적으로 운영할 수 있다.
public static void main(String[] args) {
// Thread 클래스를 상속받은 쓰레드 클래스
TestClass1 t1 = new TestClass1();
t1.start();
// Runnable 인터페이스를 구현한 클래스
TestClass2 t2 = new TestClass2();
Thread thread = new Thread(t2);
thread.start();
}
// Thread를 상속받은 클래스
class TestClass1 extends Thread {
// 쓰래드를 발생시켜 처리할 메서드
public void run() {
try {
for (int i = 0; i < 100; i++) {
Thread.sleep(500);
System.out.println("TestClass1");
}
} catch (Exception e) {
e.printStackTrace();
}
}
}
// runnable 인터페이스를 구한한 클래스
class TestClass2 implements Runnable {
@Override
public void run() {
try {
for (int i = 0; i < 100; i++) {
Thread.sleep(300);
System.out.println("TestClass2");
}
} catch (Exception e) {
e.printStackTrace();
}
}
}
여러 쓰래드를 가동 시켰을 때 우선적으로 처리될 쓰래드를 지정할 수 있다.(확률이 높아짐)
Thread1 t1 = new Thread1();
Thread2 t2 = new Thread2();
Thread3 t3 = new Thread3();
// 쓰래드 우선순위 확인 (기본은 5로 설정되어있다.)
int p1 = t1.getPriority();
int p2 = t2.getPriority();
int p3 = t3.getPriority();
// 우선순위 설정
// 숫자가 높을수록 확률이 높아진다.
t1.setPriority(10);
t2.setPriority(3);
t3.setPriority(1);
우선 순위가 높다고 해서 반드시 가장 먼저 처리되는 것은 아니고 가장 먼저 처리될 확률이 높아지는 것 뿐이다.
동기화를 하게 되면 쓰레드가 접근하는 순서대로 코드를 처리하고 늦게 도착하는 쓰레드는 기다렸다가 먼저 도착한 쓰레드의 작업이 완료가 되면 다음 쓰레드가 작업을 하게 된다.
임계영역 : 여러 개의 쓰레드가 메서드 혹은 특정 코드를 같이 사용하는 것
이 임계영역으로 인해 발생되는 오류를 방지하기 위해서 동기화를 해준다고 보면 된다.
public synchronized void method() {
// 임계영역 코드
}