프로세스는 실행 중인 프로그램을 의미한다. Java프로그램을 실행시키면 이 프로그램은 프로세스라는 이름으로 운영체제 위에서 실행된다.
즉 운영체제 위에서 실행되는 모든 프로그램은 운영체제가 만들어준 프로세스에서 실행된다.
쓰레드는 프로세스 내에서 실행되는 가벼운 작업의 흐름이다. 쉽게 생각하면 일꾼이라고 할 수 있다. 하나의 프로세스는 여러 개의 쓰레드를 가질 수 있다. 쓰레드들은 실행을 위한 프로세스 내 주소 공간이나 메모리 공간(Heap)을 공유 받는다. 추가로 쓰레드들은 각각 명령 처리를 위한 자신만의 메모리 공간(Stack)도 할당받는다.
프로세스 안에서 하나의 쓰레드만 실행되는 것을 말한다.
프로세스 안에서 여러 개의 쓰레드가 실행되는 것을 말한다.
public class Main {
public static void main(String[] args) {
Runnable task = () -> {
for (int i = 0; i < 100; i++) {
System.out.print("$");
}
};
Runnable task2 = () -> {
for (int i = 0; i < 100; i++) {
System.out.print("*");
}
};
Thread thread1 = new Thread(task);
thread1.setName("thread1");
Thread thread2 = new Thread(task2);
thread2.setName("thread2");
thread1.start();
thread2.start();
}
}
Runnable 인터페이스에 람다식을 사용하여 쓰레드를 구현했다.
setName으로 쓰레드의 이름을 지정할 수 있다.
낮은 우선순위를 가진 쓰레드를 말한다.
public class Main {
public static void main(String[] args) {
Runnable demon = () -> {
for (int i = 0; i < 1000000; i++) {
System.out.println("demon");
}
};
Thread thread = new Thread(demon);
thread.setDaemon(true);
thread.start();
for (int i = 0; i < 100; i++) {
System.out.println("task");
}
}
}
setDaemon(true)로 데몬 쓰레드로 지정해줄 수 있다.
데몬 쓰레드는 우선순위가 낮고 다른 쓰레드가 모두 종료되면 강제 종료 당하기 때문에 main()쓰레드의 task가 100번이 먼저 찍히면 종료되어 1000000번 수행되지 않고 종료된다.
쓰레드 작업의 중요도에 따라서 우선순위를 부여할 수 있다.
Thread thread1 = new Thread(task1);
thread1.setPriority(8);
setPriority() 메서드로 설정할 수 있다. ()안에 1 ~ 10 까지 우선순위 부여.
setPriority(Thread.MIN_PRIORITY) 처럼 Thread 클래스의 상수로 지정된 값을 넣어줘도 된다.
int threadPriority = thread1.getPriority();
System.out.println("threadPriority = " + threadPriority);
getPriority() 메서드로 우선순위를 확인할 수 있다.