๐ ์ฐธ๊ณ ํ ์ฑ
- ๊ธฐ๋ณธ์ ์ธ ๊ฐ๋ ์ ์ ๋ฆฌํ๊ณ ์ถ๊ฐ์ ์ผ๋ก ๊ถ๊ธํ ๊ฒ๋ค์ ์ ๋ฆฌํ์ต๋๋ค -
๐ฅ ๐ฅ ๐ฅ
โ๏ธ ํ๋ก๊ทธ๋จ, ํ๋ก์ธ์ค, ์ฐ๋ ๋_ 511p
• CPU
: ์ฐ์ฐ์ ์ํํจ์ผ๋ก์จ ์ค์ ํ๋ก๊ทธ๋จ์ ์คํํ๋ ์ฅ์น๋ก, ๊ฐ์ฅ ๋น ๋ฅธ ์๋๋ก ๋์.
• ํ๋๋์คํฌ
: ๋ฐ์ดํฐ์ ์ ์ฅ ์ญํ ์ ์ํํ๋ฉฐ, ์๋์ ์ผ๋ก ๊ฐ์ฅ ๋ฎ์ ์๋๋ก ๋์.
• ๋ฉ๋ชจ๋ฆฌ
: ์ ์ฅ๋ ๋ฐ์ดํฐ๋ฅผ CPU๋ก ๋ณด๋ด๋ ์ญํ ์ ํ๋ฉฐ, CPU์ ๊ทผ์ ํ ์๋๋ก ๋์.
• ํ๋ก๊ทธ๋จ
: ํ๋๋์คํฌ์ ์ ์ฅ๋ ํ์ผ๋ค์ ๋ชจ์.
• ํ๋ก์ธ์ค
: ๋ฉ๋ชจ๋ฆฌ์์ ๋ก๋ฉ๋ ํ๋ก๊ทธ๋จ์ผ๋ก ๋ฉ๋ชจ๋ฆฌ๋ ํ์ํ ๋ถ๋ถ๋ง์ ๋์ ์ผ๋ก ๋ก๋ฉ.
• ๋ฉํฐํ๋ก์ธ์ค
: ํ๋์ ์์ฉ ํ๋ก๊ทธ๋จ์ ๋ํด ๋์์ ์ฌ๋ฌ ๊ฐ์ ํ๋ก์ธ์ค๋ฅผ ์คํํ ์ ์๊ฒ ํ๋ ๊ธฐ์ .
• ์ฐ๋ ๋
: ์ฌ๋ฌ ๊ฐ์ ์์ ์ด ๋์์ ์ํ๋๋๋ก ํ๊ธฐ ์ํด์ ํ์ ๋ ์ฝ์ด์ ์๋ฅผ ๊ฐ๋ CPU์ ์ฌ๋ฌ ๊ฐ์ ์์ ์ ๋๋ ์ฌ์ฉํ๋ฉฐ, CPU๋ฅผ ์ฌ์ฉํ๋ ์ต์ ๋จ์.
• ๋จ์ผ ์ฐ๋ ๋
public class ThreadExample01 {
public static void main(String[] args) {
for (int i = 1; i <= 5; i++) {
System.out.println("์์
1 - i: " + i);
try {
Thread.sleep(500);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
for (int j = 1; j <= 5; j++) {
System.out.println("์์
2 - j: " + j);
try {
Thread.sleep(500);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}
ํด๋น ์ฝ๋๋ ๋จ์ผ ์ฐ๋ ๋๋ฅผ ๋ํ๋ธ ๊ฒ์ด๋ค. ์ฒซ๋ฒ์งธ for๋ฌธ๊ณผ ๋๋ฒ์งธ for๋ฌธ์ด ๋ฒ๊ฐ์๊ฐ๋ฉฐ ๋์ค๊ธธ ์ํ์ง๋ง ๋จ์ผ ์ฐ๋ ๋๋ก ์ฒซ๋ฒ์งธ for์ด ๋ชจ๋ ์ํ๋ ๋ค์ ๋๋ฒ์งธ for๋ฌธ์ด ์ํ๋๋ค.
• ๋ฉํฐ์ฐ๋ ๋
: ํ๋์ ํ๋ก์ธ์ค ์์์ ์ฌ๋ฌ ๊ฐ์ ์ฐ๋ ๋๊ฐ ์๋ ๊ฒ
โ extends Thread + 3๊ฐ์ ์ฐ๋ ๋
class Task1 extends Thread {
@Override
public void run() {
for (int i = 1; i <= 5; i++) {
System.out.println("์์
1 - i: " + i);
try {
Thread.sleep(500);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}
class Task2 extends Thread {
@Override
public void run() {
for (int j = 1; j <= 5; j++) {
System.out.println("์์
2 - j: " + j);
try {
Thread.sleep(500);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}
public class ThreadExample02 {
public static void main(String[] args) {
Task1 t1 = new Task1();
Task2 t2 = new Task2();
t1.start();
t2.start();
}
}
์ฐ๋ ๋์๋ ๋์์ฑ(concurrency)๊ณผ ๋ณ๋ ฌ์ฑ(parallelism)์ด ์๋ค. ๋์์ฑ์ ์ฒ๋ฆฌํ ์์ ์ ์๊ฐ CPU์ ์ฝ์ด ์๋ณด๋ค ๋ง์ ๋ ๊ฐ ์์ ์ ์ฐ๋ ๋์ ์์ฒญ ์์ ์ ๋ฒ๊ฐ์๊ฐ๋ฉด์ ์คํํ๋ค. ๋งค์ฐ ์งง์ ๊ฐ๊ฒฉ์ผ๋ก ๊ต์ฐจ ์คํํ๊ธฐ ๋๋ฌธ์ ์ฌ์ฉ์๋ ๋ ์์ ์ด ๋ง์น ๋์์ ์คํ๋๋ ๊ฒ์ฒ๋ผ ๋ณด์ธ๋ค. ๋ณ๋ ฌ์ฑ์ CPU์ ์ฝ์ด ์๊ฐ ์์ ์๋ณด๋ค ๋ง์ ๋๋ก ๊ฐ๊ฐ์ ์์ ์ ๊ฐ๊ฐ์ ์ฝ์ด์ ํ ๋นํด ๋์์ ์คํํ๋๋ก ํ๋ค.
์ฌ๋ฌ ์์ ์ด ์๊ณ ์ฌ๋ฌ CPU๊ฐ ์๋ค๊ณ ๊ฐ์ ํ์. ๊ทธ๋ฌ๋ฉด ๊ฐ๋ฐ์๋ ์ด๋ ์์ ์ ๋ฉํฐ ์ฐ๋ ๋๋ก ์งํํ ๊ฑด์ง ์ฝ๋๋ก ์ ์ด๋๋ฉด ๋๋ค. ๊ทธ ๋ค์ JVM์ด ์ด์์ฒด์ ๋ก ํด๋น ์ฐ๋ ๋๋ฅผ ๋๊ธฐ๊ณ ์ด์์ฒด์ ๋ ๊ฐ ์ฐ๋ ๋๋ฅผ ์ด๋ CPU์ ๋ฐฐ๋ถํ ์ง ์์์ ์ ํ๋ค. (๋ณดํต ๋ฐฐ๋ถ์ ์ค์ผ์ค๋ฌ๊ฐ ํ๋ค)
์์ ์ฝ๋๋ฅผ ์ดํด๋ณด์. extends Thread๋ก Thread๋ฅผ ์์๋ฐ์๊ณ Thread ๋ด๋ถ์ run( )๋ฉ์๋๊ฐ ์๋ค. ๊ทธ๋์ Thread๋ฅผ ์์๋ฐ์ ํด๋์ค์ run( ) ๋ฉ์๋ ์์ ์ด๋ค ๋์์ ์ํํ ์ง ์ฌ์ ์ํ๋ฉด ์ค๋ฒ๋ผ์ด๋ฉ๋์ด Thread์์ ์ฌ์ ์ํ ๋์์ ์ํํ๊ฒ ๋๋ค.
์ฐ๋ ๋์์ ํน์ดํ ์ ์ด ์๋ค. ๋ฉ์๋ run์ ์ฌ์ ์ํ์ผ๋ run์ ์คํ์ํค๋ฉด ๋ ํ ๋ฐ, run( )์ด ์๋ start( )๊ฐ ์ ํ์๋ค. ์ฐ๋ ๋๊ฐ ์ค์ CPU์ ์ด์ผ๊ธฐํ๊ธฐ ์ํด์ ์์ ๋ง์ ์คํ ๋ฉ๋ชจ๋ฆฌ์ ํฌํจํด ์ค๋นํด์ผ ํ ๊ฒ์ด ๋ง๋ค. ์ฌ๊ธฐ์ start ๋ฉ์๋๊ฐ ์ค๋น๋จ๊ณ ํฌํจํ run ๋ฉ์๋ ์คํ์ ์๋ฏธํ๋ค. start( )๋ ์๋ก์ด ์ฐ๋ ๋ ์์ฑ/์ถ๊ฐํ๊ธฐ ์ํ ๋ชจ๋ ์ค๋น + ์๋ก์ด ์ฐ๋ ๋ ์์ run( ) ์คํ์ด๋ค.
โก extends Thread + 2๊ฐ์ ์ฐ๋ ๋
class MyThread extends Thread {
public void run() {
for (int i = 1; i <= 5; i++) {
System.out.println("์์
1 - i: " + i);
try {
Thread.sleep(500);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}
public class ThreadExample03 {
public static void main(String[] args) {
MyThread t = new MyThread();
t.start();
for (int j = 1; j <= 5; j++) {
System.out.println("์์
2 - j: " + j);
try {
Thread.sleep(500);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}
์์ ์์๋ ์์ ๋ฅผ ์ดํด๋ณด๋ฉด ๊ทธ์ for๋ฌธ๋ง ์์๋๋ฐ ๋จ์ผ์ฐ๋ ๋, extends Thread๊ฐ 2๊ฐ์๋๋ฐ ์ด 3๊ฐ์ ์ฐ๋ ๋์๊ณ , ์ด๋ฒ ์ฝ๋๋ extends Thread๊ฐ 1๊ฐ์ธ๋ฐ ์ด 2๊ฐ์ ์ฐ๋ ๋์ด๋ค. ๊ทธ ์ด์ ๋ฅผ ์ดํด๋ณด๋ฉด main์ ์๋ค. ๊ฐ๋ฐ์๊ฐ ๋ช ์ํ์ง ์์๋ ์๋ฐ ํ๋ก๊ทธ๋จ์ด ์คํ๋ ๋ JVM์ ์๋์ผ๋ก main ์ฐ๋ ๋๋ฅผ ์์ฑํ๋ค. ๊ทธ๋์ ํด๋น ์ฝ๋ main์ ์ ์ด๋ for๋ฌธ์ด ๋ฉํฐ ์ฐ๋ ๋๋ก ์๋ํ๊ฒ ๋๋ค.
โข Runnable + 3๊ฐ์ ์ฐ๋ ๋
class Task1 implements Runnable {
@Override
public void run() {
for (int i = 1; i <= 5; i++) {
System.out.println("์์
1 - i: " + i);
try {
Thread.sleep(500);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}
class Task2 implements Runnable {
@Override
public void run() {
for (int j = 1; j <= 5; j++) {
System.out.println("์์
2 - j: " + j);
try {
Thread.sleep(500);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}
public class ThreadExample04 {
public static void main(String[] args) {
Runnable task1 = new Task1();
Thread t1 = new Thread(task1);
t1.start();
Runnable task2 = new Task2();
Thread t2 = new Thread(task2);
t2.start();
}
}
Runnable ์ธํฐํ์ด์ค๋ฅผ ๊ตฌํํ ํด๋์ค๋ฅผ ์ ์ํ๊ณ , run( ) ์ถ์ ๋ฉ์๋๋ฅผ ๊ตฌํํ๋ฉด์ ์ฐ๋ ๋์ ์์ ๋ด์ฉ์ ์์ฑํ๋ค. ๊ทธ๋ฆฌ๊ณ main์์ Runnable ๊ฐ์ฒด๋ฅผ ์์ฑํ๋ค.
extends Thread์ ์ฐจ์ด์ ์ด ์๋ค. ๋ฐ๋ก Runnable ๊ฐ์ฒด์ ๋ด๋ถ์๋ start( ) ๋ฉ์๋๊ฐ ์กด์ฌํ์ง ์๋๋ค๋ ๊ฒ์ด๋ค. ๊ทธ๋์ main์ ๋ณด๋ฉด start( )๋ฅผ ๊ฐ์ง๊ณ ์๋ Thread ๊ฐ์ฒด๋ฅผ ์์ฑํด์ Thread ๊ฐ์ฒด๋ก ๊ฐ์ธ start( )๋ฅผ ํธ์ถํ๋ค.
Runnable๋ก ๊ตฌํํ์ ๋์ ์ฅ์ ์ ์ธํฐํ์ด์ค๊ธฐ ๋๋ฌธ์ ๋ค๋ฅธ ํด๋์ค๋ฅผ ์์ํ ์ ์๋ค๋ ๊ฒ์ด๋ค. ์์์ ํ ๋ฒ๋ง ๋๋๋ฐ ์ฐ๋ ๋๋ฅผ ์์ํด๋ฒ๋ฆฌ๋ฉด ๋ค๋ฅธ ํด๋์ค๋ฅผ ์์ํ ์ ์๊ฒ๋๋ค.
โ๏ธ ์ฐ๋ ๋์ ์์ฑ_ 527p
• currentThread( )
: ์ฐ์ฐ์ ํ์ฌ ์ฐ๋ ๋ ๊ฐ์ฒด์ ์ฐธ์ข๊ฐ์ ์ป์ด์ฌ ์ ์๋ค.
new Thread(() -> {
System.out.println("์์
์์");
}).start();
System.out.println("main ์ค๋ ๋ ์ด๋ฆ: " + Thread.currentThread().getName());
or
Thread current = Thread.currentThread()
System.out.println("ํ์ฌ ์ค๋ ๋ ์ด๋ฆ: " + current.getName());
์์ ์ฝ๋๋ ์ฐธ์กฐ ๋ณ์ ์์ด ์คํํ ์ฝ๋์ด๋ค. ์ด๋ ๊ฒ ์ฐธ์กฐ ๋ณ์ ์์ด ์ผํ์ฑ์ผ๋ก ์ฐ๋ ๋๋ฅผ ์คํํ ๊ฒฝ์ฐ .getName( ) ๊ฐ์ ๊ฐ์ฒด์ ์์ฑ์ ๊ฐ์ ธ์ฌ ์ ์๋ค. ๊ทธ๋์ static Thread Thread.currentThread( )๋ฅผ ํตํด ํ์ฌ ์ฐ๋ ๋ ๊ฐ์ฒด ์ฐธ์ข๊ฐ์ ์ป์ด์ฌ ์ ์๋ค.
• activeCount( )
: ํ์ฌ ์คํ ์ค์ธ ์ฐ๋ ๋์ ๊ฐ์๋ฅผ ์ ์ ์๋ค.
public class ThreadExample05 {
public static void main(String[] args) {
Thread t1 = new Thread(new Runnable() {
@Override
public void run() {
System.out.println("Thread 1 ์คํ ์ค");
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("Thread 1 ์ข
๋ฃ");
}
});
Thread t2 = new Thread(new Runnable() {
@Override
public void run() {
System.out.println("Thread 2 ์คํ ์ค");
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("Thread 2 ์ข
๋ฃ");
}
});
Thread t3 = new Thread(new Runnable() {
@Override
public void run() {
System.out.println("Thread 3 ์คํ ์ค");
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("Thread 3 ์ข
๋ฃ");
}
});
t1.start();
t2.start();
t3.start();
}
}
System.out.println("ํ์ฌ ํ์ฑ ์ค๋ ๋ ์: " + Thread.activeCount());
main ์ฐ๋ ๋ ๋ด์๋ ์ด 3๊ฐ์ ์ฐ๋ ๋๊ฐ ๋์ํ๊ณ ์๋ค. ์ด๋ ๊ฒ ๊ฐ์ ๊ทธ๋ฃน ๋ด์์ ์คํ ์ค์ธ ์ฐ๋ ๋์ ๊ฐ์๋ฅผ ์๊ณ ์ถ์ ๋ activeCount๋ฅผ ์ฌ์ฉํ๋ค.
• setName( )
: ์ฐ๋ ๋์ ์ง์ ์ด๋ฆ์ ๋ถ์ฌํ๋ค.
Thread t1 = new Thread(task);
Thread t2 = new Thread(task);
t1.setName("1๋ฒ");
t2.setName("2๋ฒ");
• getName( )
: ์ง์ ์ง์ ํ๊ฑฐ๋ ์๋์ผ๋ก ๋ถ์ฌ๋ ์ฐ๋ ๋์ ์ด๋ฆ์ ๊ฐ์ ธ์จ๋ค.
for(int i=0; i<3; i++){
Thread t1 = new Thread();
t1.setName(i + "๋ฒ์งธ ์ฐ๋ ๋");
System.out.println(t1.getName());
t1.start();
}
• ์ฐ์ ์์
public final static int MIN_PRIORITY = 1;
public final static int NORM_PRIORITY = 5;
public final static int MAX_PRIORITY = 10;
void setPriority(int priority)
int getPriority()
๋ชจ๋ ์ฐ๋ ๋๋ 1~10 ์ฌ์ด์ ์ฐ์ ์์๋ฅผ ๊ฐ์ง๊ณ ์๋ค. 1์ด ๊ฐ์ฅ ๋ฎ์ ์์์ด๋ฉฐ 10์ด ๊ฐ์ฅ ๋์ ์์๋ค. ์ฐ์ ์์๋ฅผ ์ง์ ํ์ง ์์ผ๋ฉด ๊ธฐ๋ณธ๊ฐ์ผ๋ก 5์ ์ฐ์ ์์๋ฅผ ๊ฐ๋๋ค. ์ฐ์ ์์๋ ์ฐ๋ ๋์ ๋์์ฑ๊ณผ ๊ด๊ณ๊ฐ ์๋ค. ๋ง์ผ 2๊ฐ์ ์์ ์ด ์ผ์ ์๊ฐ ๊ฐ๊ฒฉ์ผ๋ก ๋ฒ๊ฐ์๊ฐ๋ฉด์ ์คํํ ๊ฒฝ์ฐ ์ฐ์ ์์๊ฐ ๋ ๋์ ์ชฝ์ด ์๋์ ์ผ๋ก ๋ง์ ์๊ฐ์ ํ ๋น๋ฐ๊ฒ ๋๋ค.
setPriority( )๋ ์ฐ์ ์์๋ฅผ ์ ํ ๋ ์ฌ์ฉํ๋ ๋ฉ์๋๊ณ , getPriority( )๋ ์ง์ ๋ ์ฐ์ ์์ ๊ฐ์ ๊ฐ์ ธ์ค๋ ๋ฉ์๋๋ค.
• availableProcessors
: ํ์ฌ ์ปดํจํฐ์ CPU ์ฝ์ด ์๋ฅผ ์๊ณ ์ถ์ ๋ ์ฌ์ฉํ๋ค.
public native int availableProcessors();
โ๏ธ ๋ฐ๋ชฌ ์ค์ _ 533p
• ๋ฐ๋ชฌ ์ฐ๋ ๋
: ์ผ๋ฐ ์ฐ๋ ๋๊ฐ ๋ชจ๋ ์ข ๋ฃ๋๋ฉด ํจ๊ป ์ข ๋ฃ๋๋ ์ฐ๋ ๋
Thread t1 = new MyThread();
t1.setDeamon(false);
t1.setName("t1");
t1.start();
Thread t2 = new MyThread();
t2.setDeamon(true);
t2.setName("t2");
t2.start();
try{Thread.sleep(3500);} catch (InterruptedException e) {}
System.out.println("main Thread ์ข
๋ฃ");
์ฐ๋ ๋์ ๋ฐ๋ชฌ ์ค์ ์ Thread ํด๋์ค์ ์ธ์คํด์ค ๋ฉ์๋์ธ setDeamon( )๋ฉ์๋๋ฅผ ์ฌ์ฉํ๋ค. ์ด๋ ๊ธฐ๋ณธ ๊ฐ์ false๋ก ์ผ๋ฐ ์ฐ๋ ๋๋ก ์ค์ ํด๋๋ค. ์์ฑํ ๊ฐ์ฒด์ ๋ฐ๋ชฌ ์ค์ ์ฌ๋ถ๋ isDeamon( )๋ฉ์๋๋ฅผ ์ฌ์ฉํด ์ธ์ ๋ ์ง ํ์ธํ ์ ์๋ค. ์์ ์ฝ๋์์ ์ฐ๋ ๋ t1์ ์ผ๋ฐ ์ฐ๋ ๋, t2๋ ๋ฐ๋ชฌ ์ฐ๋ ๋๋ก ์ค์ ํ๋ค.
๋ฐ๋ชฌ ์ค์ ์ ๋ฐ๋์ ์ฐ๋ ๋๋ฅผ ์คํํ๊ธฐ ์ ์ธ start( ) ๋ฉ์๋ ํธ์ถ ์ ์ ์ค์ ํด์ผ ํ๋ค. ์ฐ๋ ๋๊ฐ ์คํ๋๊ณ ๊ฐ๋ฉด ๋ฐ๋ชฌ ์ค์ ์ ๋ฐ๊ฟ ์ ์๊ฒ ๋๋ค.
๋ง์ฝ main์ ์ผ๋ฐ ์ฐ๋ ๋ t1๊ณผ ๋ฐ๋ชฌ ์ฐ๋ ๋ t2๊ฐ ์๋ค๊ณ ๊ฐ์ ํด๋ณด์. ๋ฐ๋ชฌ ์ฐ๋ ๋๋ ์์ ์ ํธ์ถํ main ์ฐ๋ ๋๊ฐ ์ข ๋ฃ๋๋ฉด ํจ๊ป ์ข ๋ฃ๋ ๊ฑฐ๋ผ ์์ํ๊ฒ ์ง๋ง ๋ฐ๋ชฌ์ฐ๋ ๋๋ ์ฃผ ์ฐ๋ ๋์ ์ข ๋ฃ๊ฐ ์๋ ํ๋ก์ธ์ค ๋ด์ ๋ชจ๋ ์ผ๋ฐ ์ฐ๋ ๋๊ฐ ์ข ๋ฃ๋์ด์ผ ์ข ๋ฃ๋๋ค๋ ๊ฒ์ ์์์ผํ๋ค. main์ด ๋จผ์ ๋๋ด๋ t1 ์ฐ๋ ๋๊ฐ ์ข ๋ฃ๋์ง ์์ ์ํ๋ผ๋ฉด t2๋ ์ฌ์ ํ ์๋ํ๊ณ ์์ ๊ฒ์ด๋ค.
'๐ Java > ์๋ฐ์์ ์ ๋ณต' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[Java] ์์ธ์ฒ๋ฆฌ, ์์ธ์ ๊ฐ, ์ฌ์ฉ์ ์ ์ ์์ธ ํด๋์ค (0) | 2025.05.14 |
---|---|
[Java] ์ผ๋ฐ ์์ธ์ ์คํ ์์ธ (0) | 2025.05.08 |
[Java] ์ต๋ช ์ด๋ ํด๋์ค (1) | 2025.05.02 |
[Java] ์ด๋ ํด๋์ค (0) | 2025.04.29 |
[Java] ์ถ์ํด๋์ค์ ์ธํฐํ์ด์ค (1) | 2025.04.28 |