1. Process와 Thread의 가장 큰 차이는 사용하는 자원의 차이다. Process하나가 실행하기 위해서는 많은 메모리를 필요로 하지만, Thread는 상대적으로 적은 메모리를 필요로한다. 일반적인 프로그램은 Process하나에 하나 이상의 Thread가 수행된다.
2. 쓰레드를 구현하기 위해서 java.lang.Runnable 인터페이스를 구현하면 된다.
3. Runnable 인터페이스에는 public void run() 메소드만이 선언되어 있다.
4. 만약 별도로 확장하는 클래스가 없어 확장이 가능하다면, java.lang.Thread 클래스를 확장하여 사용해도 된다.
5. 쓰레드가 시작되는 메소드는 run() 메소드이다.
6. 쓰레드를 시작하려면 run() 메소드가 아닌 start() 메소드를 호출해야만 한다.
7. Thread의 sleep() 메소드는 매개변수로 넘겨준 시간만큼 해당 쓰레드를 멈춘다.
8. sleep() 메소드로 대기하고 있는 중에 interrupt가 될 수 있으므로, InterruptedException 이 발생할 수 있다. 따라서, try-catch로 감싸주어야만 한다.
9. 데몬 쓰레드는 만약 프로세스가 종료되는 상황이 되었을때 해당 쓰레드가 종료되지 않아도 다른 실행중인 일반 쓰레드가 없다면, 해당 프로세스는 중지된다.
10. synchronized 구문은 동시에 여러 쓰레드에서 하나의 값에 접근하려고 할 때 데이터의 정합성을 지키기 위해서 사용한다. 그러므로, 여러 쓰레드에서 동시에 접근할 일이 있을 경우에만 써야한다. 그렇지 않으면 성능상 큰 문제가 발생할 수 있다.
11. syhchronized는 메소드 자체를 synchronized로 선언하는 방법과 메소드 내에 필요한 부분만 synchronized로 선언하는 두가지 방법이 있다.
12. 쓰레드의 상태는 NEW, RUNNABLE, BLOCKED, WAITING, TIMED_WAITING, TERMINATED로 나뉜다.
13. join()메소드는 해당 쓰레드가 종료될 때까지 대기한다.
14. interrupt() 메소드는 해당 쓰레드를 종료시킨다.
15. sleep(), join(), wait() 메소드가 호출되어 대기중인 상태에만 interrupt() 메소드가 처리된다.
16. wait() 메소드는 다른 쓰레드가 Object 객체에 대한 notify() 메소드나 notifyAll() 메소드를 호출할 때까지 현재 쓰레드가 대기하고 있도록 한다. 만약 매개변수로 시간을 지정하면 wait() 메소드와 동일하지만, 해당 시간까지만 대기한다.
17. notify() 메소드는 wait() 메소드로 대기중인 쓰레드가 계속해서 작업을 하도록 깨우는 작업을 한다.
18. ThreadGroup의 enumerate() 메소드는 해당 쓰레드 그룹에 포함된 쓰레드나 쓰레드 그룹의 목록을 매개변수로 넘어온 배열에 담는다.
// TimerThread 클래스가 퍼블릭 클래스여서 그냥 사용 가능했음.
public class TimerMain {
public static void main(String[] args) {
TimerThread time = new TimerThread();
time.start();
}
}
import java.util.Date;
public class TimerThread extends Thread{
public void run() {
printCurrentTime();
}
public void printCurrentTime() {
int loop = 0;
// // 10번 반복해주기 위해서 값을 이렇게 정했음
while (loop < 10) {
Date currentTime = new Date();
//밀리초 단위가 000으로 출력되길 원해서, 1000으로 나눈 후, 몫에 1000을 다시 곱해줬음.
System.out.println(currentTime.toString() + (System.currentTimeMillis() % 1000) * 1000);
try {
Thread.sleep(1000l);
} catch (Exception e) {
e.printStackTrace();
}
loop++;
// }
//
// }
// 예제 코드의 정답. 시차를 줄이기 위해서, Thread.sleep(1000 - 현시간을 1000으로 나누고 나온 몫)
// public void reduceTimeGap() {
// long currentTime=System.currentTimeMillis();
// long timeMod=currentTime%1000;
// try {
// Thread.sleep(1000-timeMod);
// } catch (Exception e) {
//
// }
// }
//
// public void printCurrentTime() {
// try {
// int count=0;
// while(count<10) {
// long current=System.currentTimeMillis();
// System.out.println(new Date(current)+" "+current);
// // reduceTimeGap()을 실행해야 하기 때문에 0.9초만 슬립
// Thread.sleep(900);
// reduceTimeGap();
// count++;
// }
// } catch (Exception e) {
// e.printStackTrace();
// }
// }
}
}
}
예제 코드의 정답은 내가 생각지도 못한 것이었다. 나는 좀 더 편하게 해결하려고 했었기 때문에 저렇게까지 생각하진 않았다. 근데 정답 코드가 아마 더 좋은 코드인 듯 하다. 나중엔 이런 방식으로도 코드를 써봐야겠다.
'Java' 카테고리의 다른 글
Recursion 재귀함수(Factorial) (0) | 2022.05.26 |
---|---|
자바의 신 ch.26 i/o (0) | 2022.05.26 |
자바의 신 ch.24 Map (0) | 2022.05.24 |
자바의 신 ch.23 Collection 2 (0) | 2022.05.23 |
자바의 신 ch.22 collection - List (0) | 2022.05.23 |