process
: ์คํ ์ค์ธ ํ๋ก๊ทธ๋จ, resources์ thread๋ก ๊ตฌ์ฑ๋๋ค.
thread
: ํ๋ก์ธ์ค ๋ด์์ ์ค์ ์์
์ ์ํํ๋ ์ผ๊พผ
single thread
: resource + thread
multi thread
: resource + thread x n, ํ๋์ ํ๋ก์ธ์ค ์์ ์ฌ๋ฌ ๊ฐ์ ์ฐ๋ ๋
์ฅ์ )
1. ํ๋์ ํ๋ก์ธ์ค๋ฅผ ๋ ์์ฑํ๋ ๊ฒ๋ณด๋ค thread๋ฅผ ๋๋ฆฌ๋ ๊ฒ์ด ๋ ๋์๋จ.
2. ์์์ ํจ์จ์ ์ผ๋ก ์ฌ์ฉ ๊ฐ๋ฅ
๋จ์ )
1. ๋๊ธฐํ ๋ฌธ์ ๋ฐ์ ๊ฐ๋ฅ
2. Starvation(๊ธฐ์ ์ํ), Deadlocked(๊ต์ฐฉ ์ํ) ์ํ ๋ฐ์ ๊ฐ๋ฅ
Thread.class : ๊ธฐ๋ณธ ์๋ฐ์์ ์ ๊ณตํ๋ ํด๋์ค, Runnable
์ ์ฌ์ฉํ์ฌ ๊ตฌํ๋์ด ์๋ค.
public class Thread implements Runnable {
}
๋ฉ์๋ ์ข
๋ฅ
์ฐธ๊ณ : https://www.tutorialspoint.com/java/lang/java_lang_thread.htm
์์ | ๋ฉ์๋ ๋ช | ์ค๋ช |
---|---|---|
1 | currentThread() | ํ์ฌ ์ฐ๋ ๋ ์ค๋ธ์ ํธ ๋ฐํ |
2 | getName() | ์ฐ๋ ๋ ์ด๋ฆ ๋ฐํ |
3 | getPriority() | ์ฐ๋ ๋ ์ฐ์ ์์ ํธ์ถ |
4 | setPriority() | ์ฐ๋ ๋ ์ฐ์ ์์ ์ธํ |
5 | run() | ์ฐ๋๋ ๋ด๋ถ์์ ์์ |
6 | sleep() | sleep() |
7 | start() | ์ฐ๋ ๋ ์์ |
8 | clone() | ํด๋์ค ๊ฐ์ฒด ๋ณต์ฌ ๋ฉ์๋ |
9 | getId() | ์ฐ๋ ๋ ์์ด๋ ๋ฐํ |
10 | holdsLock() | ํ์ฌ ์ฐ๋ ๋ ๋ฝ |
11 | join() | ์ฐ๋ ๋๊ฐ ์ฃฝ์ ๋๊น์ง ๊ธฐ๋ค๋ฆผ |
12 | yield() |
์์ )
package com.company;
public class Thread01 extends Thread {
public void run() {
System.out.println("thread ์์ํฉ๋๋ค.");
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println( currentThread().getName() + " ์๋ฃํฉ๋๋ค.");
}
public static void main(String[] args) {
Thread01 thread01 = new Thread01();
thread01.setName("thread01");
thread01.start();
Thread01 thread02 = new Thread01();
thread02.setName("thread02");
thread02.start();
}
}
package com.company;
public class Thread02 implements Runnable{
@Override
public void run() {
System.out.println("thread ์์ํฉ๋๋ค.");
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println( Thread.currentThread().getId() + "๋ฒ ์ฐ๋ ๋ ์๋ฃํฉ๋๋ค.");
}
public static void main(String[] args) {
Thread02 thread02 = new Thread02();
thread02.run();
}
}
https://docs.oracle.com/javase/8/docs/api/java/util/concurrent/ExecutorService.html
์์ | ๋ฉ์๋ ๋ช | ์ค๋ช |
---|---|---|
1 | boolean awaitTermination() | ์ข ๋ฃ ์์ฒญ ํ ๋ชจ๋ ์์ ์ด ์คํ ์๋ฃ๋๊ฑฐ๋ ์๊ฐ์ด๊ฐ ๋๋ ๊ฒฐ๊ณผ๊ฐ ๋์ฌ ๋ ๊น์ง ๊ธฐ๋ค๋ฆฐ๋ค. |
2 | List<Future> invokeAll() (Collection <? extends Callable tasks>) | ์ฃผ์ด์ง ์์ ์ ์คํํ๊ณ ์๋ฃ ๋๋ฉด ์ํ์ ๊ฒฐ๊ณผ๋ฅผ ์ ์งํ๋ Future ๋ชฉ๋ก ๋ฐํ |
3 | T invokeAny(Collection <? extends > tasks) | ์ฃผ์ด์ง ์๊ฐ ์ด๊ณผ๊ฐ ๊ฒฝ๊ณผํ๊ธฐ ์ ์ ์ฑ๊ณต์ ์ผ๋ก ์๋ฃ๋ ์์ ์ ๊ฒฐ๊ณผ๋ฅผ ๋ฐํ |
4 | boolean isShutdown() | true ์ด ์คํ๊ธฐ์ ์ข ๋ฃ๋ ๊ฒฝ์ฐ ๋ฐํ |
5 | boolean isTerminated() | true ์ข ๋ฃ ํ ๋ชจ๋ ์์ ์ด ์๋ฃ๋ ๊ฒฝ์ฐ ๋ฐํ |
6 | void shutdown() | ์ด์ ์ submit() ๋๊ฒ์ ์คํ๋์ง๋ง ์ ์์ ์ด ํ์ฉ๋์ง ์์ ์ฑ๋ก ์ข ๋ฃ ๊ธฐ๋ค๋ฆผ |
7 | List shutdownNow() | ๋ชจ๋ ํ์ฑ ์คํ ์์ ์ ์ค์งํ๊ณ ์คํ ๋๊ธฐ ์ค์ด๋ ์์ ์ ๋ฐํ |
8 | Future submit(Callable task) | ์คํ์ ์ํด Runnable ์์ ์ ์ ์ถํ๊ณ ํด๋นํ๋ ์์ ์ Future ๋ฐํ |
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
public class Thread03 {
public static void main(String[] args) {
// ์ฐ๋ ๋ ํ๋ ์์ฑ
ExecutorService es = Executors.newSingleThreadExecutor();
es.submit(() -> {
System.out.println(Thread.currentThread().getName() + " ์์ํฉ๋๋ค.");
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println(Thread.currentThread().getName() + " ์๋ฃํฉ๋๋ค.");
});
// ์ฐ๋ ๋ ํ ํ๋ ์์ฑ
es.execute(new Runnable() {
@Override
public void run() {
System.out.println(Thread.currentThread().getName() + " ์์ํฉ๋๋ค.");
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println(Thread.currentThread().getName() + " ์๋ฃํฉ๋๋ค.");
}
});
ExecutorService es2 = Executors.newFixedThreadPool(10);
for(int i = 0 ; i < 10 ; i++ ) {
es2.submit(() -> {
System.out.println(Thread.currentThread().getName() + " ์์ํฉ๋๋ค.");
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println(Thread.currentThread().getName() + " ์๋ฃํฉ๋๋ค.");
});
}
es.shutdown();
es2.shutdown();
}
}
ํ๋์ ์ฐ๋ ๋๋ก 2๊ฐ์ ์์ ์ ํ ์๊ฐ๊ณผ ๋๊ฐ์ ์ฐ๋ ๋๋ก 2๊ฐ์ ์์ ์ ํ์๊ฐ์ ์ฌ์ค 2๊ฐ์ ์ฐ๋ ๋๋ก ์์ ํ ์๊ฐ์ด ๋ ๊ธธ๋ค. ์๋ํ๋ฉด ํ๋์ ์์์ ๋๊ณ ์ฐ๋ ๋๊ฐ ์์ ์ ๊ตํํ๋ ์๊ฐ(context switching) ์ ์๊ฐ์ด ๋ ๊ฑธ๋ฆฌ๊ธฐ ๋๋ฌธ์ด๋ค.
ํ์ง๋ง ๋ฉํฐ ์ฝ์ด์ผ๊ฒฝ์ฐ, ์ฆ ์์์ด 2๊ฐ ์ด์์ธ ๊ฒฝ์ฐ๋ ๋ค๋ฅด๋ค. ํค๋ณด๋๋ก ์ ๋ ฅํ๋ ์ฐ๋ ๋๊ฐ ๋์ํ ๋ ๋ค๋ฅธ ์ฐ๋ ๋๊ฐ ๋์ ๋์ํ์ง ์๋๋ค๋ฉด ๋ชจ๋ํฐ์ ๊ธ์๊ฐ ํํ๋๋ ์ผ์ ์์ ๊ฒ์ด๋ค. ์ด์ฒ๋ผ ๋ฉํฐ ์ฐ๋ ๋๋ ๋ฉํฐ ์ฝ์ด์ผ๋ ์์ ํจ์จ์ ์ข๊ฒ ๋ง๋ ๋ค.
์ด๋ ๊ฒ ์ฌ๋ฌ๊ฐ์ ์ฐ๋ ๋๊ฐ ๋์๊ฐ ๊ฒฝ์ฐ ์ฐ๋ ๋์ ์ฐ์ ์์๋ ์ค์ํด์ง๋ค. ํ์ผ๋ค์ด๋ก๋๋ ํค๋ณด๋ ์น๊ธฐ๊ฐ ๋์์ ๋์๊ฐ๋ฉด ์ฌ์ฉ์๊ฐ ์ฑ๊ฐํ๊ธฐ ์ฌ์ด ํค๋ณด๋ ์น๊ธฐ๊ฐ ๊ฐ์ฅ ์ฐ์ ์์๊ฐ ๋์์ผ ์ฌ๋ฌ ํธ์์ฑ์ ์ ๊ณตํ๊ธฐ ๋๋ฌธ์ด๋ค. ์ฐ์ ์์๋ 1-10 ๊น์ง์ ์ซ์๋ก ๋๋์ ์๋๋ฐ ๋ณดํต 10์ด ๊ฐ์ฅ ์ฐ์ ์์๊ฐ ๋๋ค.
๋ํ ๋ฉํฐ ์ฐ๋ ๋์์๋ ๊ด๋ จ์๋ ์ฐ๋ ๋๋ฅผ ๊ทธ๋ฃน์ผ๋ก ๋ค๋ฃจ๊ธฐ ์ํ ๊ฒ์ด๋ค. ๋ํ ๋ณด์์ ์ธ ์ด์ ๋ก ์ด๋ ๊ฒ ๋ฌถ์ด์ ๊ด๋ฆฌํ๋๋ฐ ์์ ์ด ์ํ ์ฐ๋ ๋ ๊ทธ๋ฃน์ด๋ ํ์ ์ค๋ ๋ ๊ทธ๋ฃน์ ๋ณ๊ฒฝํ ์ ์์ง๋ง ๋ค๋ฅธ ์ค๋ ๋ ๊ทธ๋ฃน์ ์ฐ๋ ๋๋ ๋ณ๊ฒฝํ ์ ๋ ์๋ค.