프로그램의 하나의 흐름. 일을 처리하는 사람
프로그램이 시작되면 os가 프로그램에 허가를 주고, 쓰레드가 부여된다.
이때까지 코딩한 것들은 전부 단일쓰레드 프로그래밍이다.
무언가를 하고 있으면 다른 것을 할 수 없다.(동시에 어떤 일을 할 수 없다.)
ex. 게임에서 만약 쓰레드가 하나일 경우, 내 캐릭터만 움직이고, 다른 유저의 캐릭터는 내 캐릭터가 움직일 때만 움직이던지 아니면 아에 움직일 수 없다.
Runnable: 실행 가능 한. 시킬 일.
Thread: 흐름. 해야할 일.
<선언>
Runnable 변수이름 = new Runnable() {
@Override
public void run() {
}
};
Thread 변수이름 = new Thread(Runnable값);
ex.
Runnable todo = new Runnable() {
@Override
public void run() {
}
};
Thread thread = new Thread(todo);
Tip) Override
기존에 있는 코드들을 계승받아서, 한 번더 업그레이드 시켜줌.
public static void main(String[] args) {
for (int i = 0; i < 60; i++) {
System.out.println("첫 번째 쓰레드: " + i);
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
Runnable todo = new Runnable() {
@Override
public void run() {
for (int i = 0; i < 60; i++) {
System.out.println("두 번째 쓰레드: " + i);
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
};
Thread thread = new Thread(todo);
thread.start();
}
Tip) Thread.sleep(1000)은 1초간 딜레이를 주는 것이다.
Tip) Runnable 값을 넣어준 thread를 실행시킬 땐 .start()를 사용한다.
But, 위와 같은 코드를 실행하여도 동시에 두 개의 쓰레드가 실행되지 않고, 첫 번째 쓰레드가 모두 실행된 후, 두 번째 쓰레드가 실행된다. 왜냐하면, 새로운 쓰레드를 만들어주는 코드 위에 첫 번째(메인)쓰레드가 실행되고 있으므로, Thread thread를 만나기 전까지는 단일쓰레드 프로그램이랑 같기 때문이다. 따라서 순서를 바꿔준다.
public static void main(String[] args) {
Runnable todo = new Runnable() {
@Override
public void run() {
for (int i = 0; i < 60; i++) {
System.out.println("두 번째 쓰레드: " + i);
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
};
Thread thread = new Thread(todo);
thread.start();
for (int i = 0; i < 60; i++) {
System.out.println("첫 번째 쓰레드: " + i);
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
제대로 메인쓰레드와, 백그라운드쓰레드가 동시에 돌아가는 것을 볼 수 있다.
Tip) Thread thread = new Thread()로 돌아가는 쓰레드가 백그라운드 쓰레드이고, 우리가 일반적으로 코딩하던 부분은 메인쓰레드이다.