: ์คํ ์ค์ธ ํ๋ก๊ทธ๋จ
: resource + thread(์ฌ๋ฌ๊ฐ)
์ฐ๋ฆฌ๊ฐ ๊ฐ์ง ํ๋ก๊ทธ๋จ์ ์คํ์ํค๊ธฐ ์ํด์๋ OS๋ก๋ถํฐ resource๋ฅผ ํ ๋น ๋ฐ์์ผ ํ๋ค. ํ ๋น ๋ฐ์์ ์คํํ ํ๋ก๊ทธ๋จ์ process๋ผ๊ณ ํ๋ค.
process์๋ ์ต์ ํ ๊ฐ ์ด์์ thread๊ฐ ์กด์ฌํ๋ค.
thread๊ฐ ๋ฑ ํ ๊ฐ ์๋ ๊ฒฝ์ฐ : single-thread process
thread๊ฐ ๋ ๊ฐ ์ด์ ์๋ ๊ฒฝ์ฐ : multi-thread process
-> ์ง๊ธ๊น์ง ์์ฑํ๋ ํ๋ก๊ทธ๋จ(์ฝ๋)๋ค ์์๋ thread๊ฐ ํ๋์ด๋ค. ์ฝ๋์์ thread๋ฅผ ์ถ๊ฐ์ ์ผ๋ก ๋ง๋ค์ง ์์๊ธฐ ๋๋ฌธ์ด๋ค.
resource
1. code : ํ๋ก๊ทธ๋จ ์คํ ์ฝ๋
2. data : ํ๋ก๊ทธ๋จ์ ์คํํ๊ธฐ ์ํ ๋ฐ์ดํฐ
3. Heap : ๋์ ๋ฉ๋ชจ๋ฆฌ ์์ญ
4. Stack : ํจ์ ์คํ ์์ญ
: ๋ด๋ถ์์ ํ์๋ ๋ชจ๋ User define thread๊ฐ ์ข ๋ฃ๋๋ ์๊ฐ ์ข ๋ฃ๋๋ค.
: 1๊ฐ์ core๋ ํ ์๊ฐ์ ํ๊ฐ์ง ์ผ๋ง ์ํํ ์ ์๋ค.
๋ง์ฝ, Single Core์ธ ๊ฒฝ์ฐ๋ฅผ ๊ฐ์ ํ๋ฉด
์ฐ๋ฆฌ๊ฐ ์ฌ์ฉํ๋ ์ฌ๋ฌ ํ๋ก๊ทธ๋จ์ด ๋ง์น ๋์์ ์คํ๋๋ ๊ฒ์ฒ๋ผ ๋ณด์ธ๋ค.
ex) Excel, powerpoint, game, music, ...
-> time slicing (์๋ถํ ) ๊ธฐ๋ฒ
-> Multitasking (core์ ๊ฐ์์๋ ์๊ด ์๋ค.)
Multiprocessing
: ํ๋ก๊ทธ๋จ ๋๊ฐ๊ฐ ์๊ฐ์ ์ผ๋ก ๋์์ ์คํ๋๋ ๊ฒ
core๊ฐ ํ ๊ฐ์ด๋ฉด ์๋๋ค. ์ฌ๋ฌ๊ฐ์ core์ฌ์ผ ํ๋ค.
: execution stack์ ๋ณ๋๋ก ๊ฐ์ง๊ณ ์๋ ์คํ ํ๋ฆ
stack์ thread ๋ณ๋ก ํ ๋น์ด ๋๋ค. main๋ ํ๋์ ์คํ ํ๋ฆ(thread)์ด๋ค. -> main thread
ํ๋ก๊ทธ๋จ ์์ ์ฌ๋ฌ ๊ฐ์ thread๊ฐ ์กด์ฌํ ์ ์๊ฒ ๋๋ ๊ฒ์ด๋ค. ์ฌ๋ฌ ๊ฐ์ ์คํํ๋ฆ์ ๊ฐ์ง๊ณ ์์ ์ ๋๋์ด์ ๋์์ ์ํ ํ๋ ๊ฒ์ด ๋ ํจ์จ์ ์ด๋ค.
thread๊ฐ ๋ฌด์กฐ๊ฑด ๋ง์์๋ก ์ข์ง๋ ์๋ค.
stack ์์ญ์ด thread๋ง๋ค ํ ๋น์ด ๋์ด์ผ ํ๋๊น resource๊ฐ ๋ถ์กฑํด์ง ์ ์๋ค.
-> ์ ์ ์์ thread๋ฅผ ์ ์งํด์ผ ํ๋ค.
: ํ๋์ ํ๋ก๊ทธ๋จ์์ ์ฌ๋ฌ ๊ฐ์ thread๊ฐ ์กด์ฌํ ๋, ์๊ฐ์ ๋์์ ์คํ์ด ๋๋ ๊ฒ์ฒ๋ผ ํ๋ ๊ฒ
time slicing(์๋ถํ )๋ก multitasking์ด ์ผ์ด๋๊ฑฐ๋
์ฌ๋ฌ๊ฐ์ core๋ก multiprocessing์ด ์ผ์ด๋ ์๋ ์๋ค.
thread๋ฅผ ๋ง๋ค ๋, JVM์ด thread๋ฅผ ์์ฑํ๊ณ , ์์ฑ๋ thread๊ฐ main์ ํธ์ถํ๋ค. ์ด thread๋ฅผ main thread๋ผ๊ณ ํ๋ ๊ฒ์ด๋ค.
Java์์ thread๋ instance์ด๋ค. -> ์ด instance๋ฅผ ๋ง๋ค์ด๋ด๋ class๊ฐ ์กด์ฌํ๋ค.
=> Thread class
package lecture0714;
class MyThread extends Thread{
@Override
public void run() {
System.out.println("Hello");
}
}
public class Main {
public static void main(String[] args) {
MyThread t = new MyThread();
t.run();
}
}
package lecture0714;
class MyThread extends Thread{
@Override
public void run() {
System.out.println("Hello");
}
}
public class Main {
public static void main(String[] args) {
MyThread t = new MyThread();
t.start();
}
}
start()๋ฅผ ํธ์ถํด์ผ ์๋ก์ด thread / ์คํ ํ๋ฆ์ด ์๊ฒจ๋๊ฒ ๋๋ค.
start()
: thread ์์ฑ, stack ํ ๋น, run() ํธ์ถ
package lecture0714;
class MyThread2 implements Runnable {
@Override
public void run() {
System.out.println("์ด๊ฒ๋ ์คํ!");
}
}
public class Main {
public static void main(String[] args) {
MyThread2 a = new MyThread2(); // ์์ง thread๊ฐ ์๋๋ค.
Thread t1 = new Thread(a);
t1.start();
System.out.println("์๋
ํ์ธ์!");
}
}
package lecture0714;
class ThreadEx_01_1 extends Thread {
@Override
public void run() {
for(int i=0; i<5; i++) {
System.out.println(getName());
}
}
}
class ThreadEx_01_2 implements Runnable {
@Override
public void run() {
for(int i=0; i<5; i++) {
System.out.println(Thread.currentThread().getName()); // Thread class์ static method. ์ด ์ฝ๋๋ฅผ ์คํ์ํค๋ thread๋ฅผ ์ง์นญํ๋ค.
}
}
}
public class ThreadExam01 {
public static void main(String[] args) {
ThreadEx_01_1 t1 = new ThreadEx_01_1();
ThreadEx_01_2 r = new ThreadEx_01_2();
Thread t2 = new Thread(r);
// ์
์ค์์ ์ด๋ค ๊ฒ์ด ๋จผ์ ์คํ๋ ์ง๋ ๋ชจ๋ฅธ๋ค.
// ์ค์ผ์ค๋ฌ์ ์ํด์ ์ ํ๋์ด์ ์คํ๋๋ค.
t1.start();
t2.start();
System.out.println("main thread ์ข
๋ฃ");
}
}
single thread์์ ์ฒ๋ฆฌํด์ผ ํ ์์ ์ด ๋๊ฐ์ด๋ค. (A,B)
: setPriority()
single core์์๋ง ๊ฐ๋ฅํ๋ค. multi core์์๋ ์๋ฏธ๊ฐ ์๋ค. ์ ๋๋ก ๋์ํ์ง ์๋๋ค.
: ๋ค๋ฅธ ์ผ๋ฐ thread์ ๋ณด์กฐ์ ์ธ ์์
์ ํ๊ธฐ ์ํด ์ฌ์ฉํ๋ค.
ํด๋น daemon thread๋ฅผ ํ์์ํจ thread๊ฐ ์ข
๋ฃ๋๋ฉด ๊ฐ์ด ์ข
๋ฃ๋๋ค.
ex) Garbage collecttion, ์๋ ์ ์ฅ ๊ธฐ๋ฅ
t1.setDaemon(true);
package lecture0714;
// Daemon Thread ์์๋ณด๊ธฐ
public class ThreadExam02 implements Runnable {
static boolean autoSave = false;
public static void main(String[] args) {
Thread t = new Thread(new ThreadExam02());
t.setDaemon(true);
t.start();
for(int i=0; i<10; i++) {
try {
Thread.sleep(1000); // main thread๋ฅผ ์ฌ์ด๋ค.
} catch (Exception e) {
}
System.out.println(i);
if(i == 5) {
autoSave = true;
}
}
}
@Override
public void run() {
while(true) {
try {
Thread.sleep(3000); // t thread๋ฅผ ์ฌ์ด๋ค.
} catch (InterruptedException e) {
}
if(autoSave) {
System.out.println("์๋์ ์ฅ๋์์ต๋๋ค!");
}
}
}
}
: ์ผ์ ์๊ฐ๋์ thread๋ฅผ ์ค์ง์ํจ๋ค.
sleep์ ๋ค์ด๊ฐ๋ฉด ์ฟจ์ฟจ ์๋ค. sleep์์ ๊นจ์ด๋๋ ์กฐ๊ฑด
1. ์ง์ ๋ ์๊ฐ์ด ๋ค ๋์๋ค.
2. Thread์ ๋ํด interrupt()๊ฐ ํธ์ถ๋๋ค. (InterruptedExceiption์ด ๋ฐ์)
-> ์ด ์ด์ ๋๋ฌธ์ sleep์ ํญ์ try~catch ๋ฌธ๊ณผ ํจ๊ป ์ฐ์ฌ์ผ ํ๋ค.
: sleep์์ ๊นจ์ด๋๋ ์กฐ๊ฑด์ด ๋๋ฉด Running ์ํ๋ก ๊ฐ๋ ๊ฒ์ด ์๋๋ผ Runnable ์ํ๋ก ๋์๊ฐ๋ค. ๋ค์ Runnable ์ํ์ thread๋ค๊ณผ ์ ํ๋ฐ๊ธฐ ์ํด ๊ฒฝ์ํ๋ค.
package lecture0714;
class ThreadEx_03_1 extends Thread {
@Override
public void run() {
for(int i=0; i<300; i++) {
System.out.print("-");
}
System.out.println("<<Thread 1 ์ข
๋ฃ>>");
}
}
class ThreadEx_03_2 extends Thread {
@Override
public void run() {
for(int i=0; i<300; i++) {
System.out.print("|");
}
System.out.println("<<Thread 2 ์ข
๋ฃ>>");
}
}
public class ThreadExam03 {
public static void main(String[] args) {
ThreadEx_03_1 t1 = new ThreadEx_03_1();
ThreadEx_03_2 t2 = new ThreadEx_03_2();
t1.start();
t2.start();
try {
t1.sleep(2000); // ํ์ฌ ์คํ๋๊ณ ์๋ thread๋ฅผ ์ฌ์ฐ๋ ๊ฒ์ด๊ธฐ ๋๋ฌธ์ main thread๊ฐ ์๋ค.
// t1.sleep(2000) ์ด๋ t2.sleep(2000) ์ด๋ Thread.sleep(2000) ์ด๋ ๋ชจ๋ ๊ฐ๋ค.
} catch (Exception e) {
}
System.out.println("<<main Thread ์ข
๋ฃ>>");
}
}
package lecture0714;
class ThreadEx_03_1 extends Thread {
@Override
public void run() {
try {
Thread.sleep(2000);
} catch (Exception e) {
}
for(int i=0; i<300; i++) {
System.out.print("-");
}
System.out.println("<<Thread 1 ์ข
๋ฃ>>");
}
}
class ThreadEx_03_2 extends Thread {
@Override
public void run() {
for(int i=0; i<300; i++) {
System.out.print("|");
}
System.out.println("<<Thread 2 ์ข
๋ฃ>>");
}
}
public class ThreadExam03 {
public static void main(String[] args) {
ThreadEx_03_1 t1 = new ThreadEx_03_1();
ThreadEx_03_2 t2 = new ThreadEx_03_2();
t1.start();
t2.start();
System.out.println("<<main Thread ์ข
๋ฃ>>");
}
}
: Thread ์คํ ํ ์์ ์ด ๋๋๊ธฐ ์ ์ ํด๋น thread๋ฅผ ์ค์ง์ํค๊ณ ์ถ์ ๋ ์ฌ์ฉํ๋ค.
interrupt()๋ ์ง์ ์ค์ง ์ํค์ง ์๊ณ , thread์ ๋ด๋ถ์ํ ๊ฐ์ธ "Interrupted state"๋ฅผ ๋ณ๊ฒฝํ๋ค.
๐คกThread๊ฐ interrupt๊ฐ ๋์๋์ง ํ์ธํ๋ method
interrupted() - Thread class์ static
: ํ์ฌ ์ํ ์ค์ธ thread๊ฐ interrupt๊ฐ ๋์๋์ง ์ฌ๋ถ๋ฅผ ์์๋ธ๋ค.
interrupt ์ฌ๋ถ๋ฅผ ์กฐ์ฌํ๊ณ ์ํ๊ฐ์ ๋ฌด์กฐ๊ฑด False๋ก ๋ฐ๊พผ๋ค.
isInterrupted() - Thread class์ static X
: ํน์ thread๊ฐ interrupt๊ฐ ๋์๋์ง ์ฌ๋ถ๋ฅผ ์์๋ธ๋ค.
interrupt ์ฌ๋ถ๋ฅผ ์กฐ์ฌ๋ง ํ๊ณ ์ํ๊ฐ๋ง ๋ฆฌํดํ๋ค.(True/False)
stop() - thread์ ๊ฐ์ ์ค์ง
-> ์๋์น ์์ ์ํฉ์ด ๋ฐ์ํ ์ ์์ด ํ์ฌ๋ ์ฌ์ฉํ์ง๋ ์๋๋ค. (deprecated)
suspend() - thread์ ์ผ์ ์ค์ง
resume() - ์ผ์ ์ค์ง๋ thread์ ์ฌ์์
start() - thread์ ์์
- ์ฝ๋
: deprecated ๋ ๊ฒ ์ฌ์ฉpackage lecture0714; class ThreadEx_05 implements Runnable { @Override public void run() { while(true) { // 1์ด ์ค๋ค ์ผ์ด๋์ ์์ ์ ์ด๋ฆ์ ์ฐ๋๋ค. System.out.println(Thread.currentThread().getName()); try { Thread.sleep(1000); } catch (Exception e) { } } } } public class ThreadExam05 { public static void main(String[] args) { ThreadEx_05 r = new ThreadEx_05(); Thread t1 = new Thread(r, "*"); // thread์ ์ด๋ฆ์ *๋ก ์ง๋๋ค. Thread t2 = new Thread(r, "**"); Thread t3 = new Thread(r, "***"); t1.start(); t2.start(); t3.start(); try { Thread.sleep(2000); // main thread ์ฌ์ฐ๊ธฐ t1.suspend(); // t1์ ์ผ์ ์ค์ง Thread.sleep(2000); t2.suspend(); Thread.sleep(2000); t1.resume(); // t1์ด ๋ค์ ๋์ํ๋๋ก ์ค์ Thread.sleep(2000); t1.stop(); t2.stop(); Thread.sleep(2000); t3.stop(); } catch (Exception e) { } } }
: no deprecated ์ฌ์ฉ
package lecture0714; class ThreadEx_06 implements Runnable { volatile boolean suspended = false; volatile boolean stopped = false; @Override public void run() { while(!stopped) { // 1์ด ์ค๋ค ์ผ์ด๋์ ์์ ์ ์ด๋ฆ์ ์ฐ๋๋ค. if(!suspended) { System.out.println(Thread.currentThread().getName()); try { Thread.sleep(1000); } catch (Exception e) { } } } } public void suspend() { suspended = true; } public void stop() { stopped = true; } public void resume() { suspended = false; } } public class ThreadExam06 { public static void main(String[] args) { ThreadEx_06 r1 = new ThreadEx_06(); ThreadEx_06 r2 = new ThreadEx_06(); ThreadEx_06 r3 = new ThreadEx_06(); Thread t1 = new Thread(r1, "*"); // thread์ ์ด๋ฆ์ *๋ก ์ง๋๋ค. Thread t2 = new Thread(r2, "**"); Thread t3 = new Thread(r3, "***"); t1.start(); t2.start(); t3.start(); try { Thread.sleep(2000); // main thread ์ฌ์ฐ๊ธฐ r1.suspend(); // t1์ ์ผ์ ์ค์ง Thread.sleep(2000); r2.suspend(); Thread.sleep(2000); r1.resume(); // t1์ด ๋ค์ ๋์ํ๋๋ก ์ค์ Thread.sleep(2000); r1.stop(); r2.stop(); Thread.sleep(2000); r3.stop(); } catch (Exception e) { } } }
volatile์ด ์์ ๋๋ ์ ๋๋ก ์คํ๋์ง ์๋๋ค.
๋ฉํฐ์ฝ์ด ํ๋ก์ธ์์์๋ ์๋๋ฅผ ๋์ด๊ธฐ ์ํด ์บ์๋ฅผ ์ฌ์ฉํด ํ๋๊ฐ์ ๋ฐ๊พธ๊ธฐ ๋๋ฌธ์ ์ ๋๋ก ์๋๋์ง ์์๋ค. volatile์ ๋ถ์ฌ์ ์ง์ ๋ฉ๋ชจ๋ฆฌ์ ์ ๊ทผํ๊ฒ ๋ฐ๊ฟ์ค๋ค.
package lecture0714;
import javax.swing.JOptionPane;
class ThreadEx_04 extends Thread {
@Override
public void run() {
int i = 10;
while(i != 0 && !isInterrupted()) { // i๊ฐ 0์ด ์๋๊ณ , interrupt๊ฐ ๊ฑธ๋ฆฌ์ง ์์์ผ๋ฉด ๊ณ์ ๋ฐ๋ณตํ๋ค.
System.out.println(--i);
try {
Thread.sleep(4000);
// sleep์์ interrupt๊ฐ ๊ฑธ๋ฆฌ๋ฉด interrupted ์ํ๊ฐ ๋ค์ false๊ฐ ๋๋ค.
} catch (Exception e) {
interrupt();
}
// for(long k=0; i<2500000000L; k++); // ์๊ฐ ์ง์ฐ
}
System.out.println("์นด์ดํธ๊ฐ ์ข
๋ฃ๋์์ด์!");
}
}
public class ThreadExam04 {
public static void main(String[] args) {
Thread t = new ThreadEx_04();
t.start();
String input = JOptionPane.showInputDialog("๊ฐ์ ์
๋ ฅํ์ธ์!"); // ๊ฐ์ ์
๋ ฅํ ๋๊น์ง main thread๋ ์ฌ๊ธฐ์ blocking ๋๋ค.
System.out.println("์
๋ ฅ๊ฐ์ : " + input);
t.interrupt();
// thread t์ ๋ด๋ถ์ํ ์ ๋ณด(interrupted ์ํ)๋ฅผ true๋ก ๋ฐ๊พผ๋ค.
System.out.println("Thread ์ํ๊ฐ์ : " + t.isInterrupted());
}
}
: Thread๊ฐ ์์ ์๊ฒ ์ฃผ์ด์ง ์คํ ์๊ฐ์ ๋ค ์ฐ์ง ์๊ณ ๋ค๋ฅธ thread์๊ฒ ์๋ณดํ๋ค.
-> ํ๋ก๊ทธ๋จ์ ์๋ต์ฑ์ ๋์ด๊ธฐ ์ํด ์ฌ์ฉ๋๋ค.
์์ no deprecated ์์ ์์๋ suspend๊ฐ ๋ ์ํ๋ผ๋ฉด ์ถ๋ ฅ๋ง ๋์ง ์๊ณ while๋ฌธ์ ๊ณ์ํด์ ๋๊ฒ ๋๋ค -> busy waiting
=> yeild๋ก ๋ค๋ฅธ thread์๊ฒ ์๋ณดํ๋ค.
package lecture0714;
class ThreadEx_06 implements Runnable {
volatile boolean suspended = false;
volatile boolean stopped = false;
@Override
public void run() {
while(!stopped) { // 1์ด ์ค๋ค ์ผ์ด๋์ ์์ ์ ์ด๋ฆ์ ์ฐ๋๋ค.
if(!suspended) {
System.out.println(Thread.currentThread().getName());
try {
Thread.sleep(1000);
} catch (Exception e) {
}
} else {
Thread.yield(); // ์ผ์์ ์ง๋ผ์ runnable ์ํ๋ก ๋ฐ๋๋ฉด์ ๋น ์ง๋ค.
}
}
}
public void suspend() {
suspended = true;
}
public void stop() {
stopped = true;
}
public void resume() {
suspended = false;
}
}
public class ThreadExam06 {
public static void main(String[] args) {
ThreadEx_06 r1 = new ThreadEx_06();
ThreadEx_06 r2 = new ThreadEx_06();
ThreadEx_06 r3 = new ThreadEx_06();
Thread t1 = new Thread(r1, "*"); // thread์ ์ด๋ฆ์ *๋ก ์ง๋๋ค.
Thread t2 = new Thread(r2, "**");
Thread t3 = new Thread(r3, "***");
t1.start();
t2.start();
t3.start();
try {
Thread.sleep(2000); // main thread ์ฌ์ฐ๊ธฐ
r1.suspend(); // t1์ ์ผ์ ์ค์ง
Thread.sleep(2000);
r2.suspend();
Thread.sleep(2000);
r1.resume(); // t1์ด ๋ค์ ๋์ํ๋๋ก ์ค์
Thread.sleep(2000);
r1.stop();
r2.stop();
Thread.sleep(2000);
r3.stop();
} catch (Exception e) {
}
}
}
: ๋ค๋ฅธ thread๋ฅผ ์ง์ ํด์ ๋ด๊ฐ ์ํ๋๊ณ ์๋ ์ค๊ฐ์ ๋ผ์ด๋ค ์ ์๊ฒ ํ๋ค.
static method๊ฐ ์๋๋ค.
sleep์ ํน์ thread๋ฅผ ์ง์ ํด์ ์ฌ์ธ ์๊ฐ ์๋ค. ํ์ฌ ์คํ๋๊ณ ์๋ thread๋ฅผ ์ฌ์ด๋ค. => ๊ทธ๋์ sleep์ static method์ด๋ค.
ํ์ฌ thread๊ฐ block ๋๋ ๊ฒ์ join๊ณผ ๋์ผํ๋ค.
package lecture0715;
class ThreadEx_07_1 extends Thread {
@Override
public void run() {
for(int i=0; i<300; i++) {
System.out.print("-");
}
}
}
class ThreadEx_07_2 extends Thread {
@Override
public void run() {
for(int i=0; i<300; i++) {
System.out.print("|");
}
}
}
public class ThreadExam07 {
public static void main(String[] args) {
Thread t1 = new ThreadEx_07_1();
Thread t2 = new ThreadEx_07_2();
t1.start();
t2.start();
try {
t1.join(); // main thread๋ฅผ ๋ฉ์ถ๊ณ t1์ ํฌํจ์ํจ๋ค.
t2.join();
} catch (Exception e) {
// TODO: handle exception
}
System.out.println("<<main ์ข
๋ฃ>>");
}
}
package lecture0715;
class ThreadEx_08_1 extends Thread {
final static int MAX_MEMORY = 1000; // ์ต๋ ๋ฉ๋ชจ๋ฆฌ ์ฉ๋
int usedMemory = 0; // ์ฌ์ฉ๋ ๋ฉ๋ชจ๋ฆฌ๋
@Override
public void run() {
while(true) { // ๋ฌดํ ๋ฃจํ์ด๋ฉด ๋๋์ง ์๊ธฐ ๋๋ฌธ์ ์ด thread๋ daemon thread๋ก ๋ง๋ค์ด์ค์ผ ํ๋ค.
try {
Thread.sleep(10000); // 10์ด ๋์ ์๋ค.
} catch (Exception e) { // ์๋ ๋์ ๋๊ตฐ๊ฐ ๊นจ์์ interrupt ๋ฐ์ํ ๊ฒฝ์ฐ
System.out.println("interrupt์ ์ํด์ ๊นจ์ด๋ฌ์ด์!");
}
gc();
System.out.println("๋ฉ๋ชจ๋ฆฌ ์ฒญ์ ์๋ฃ! ํ์ฌ ์ฌ์ฉ ๊ฐ๋ฅํ ๋ฉ๋ชจ๋ฆฌ๋ : " + freeMemory());
}
}
// garbage collection
private void gc() { // ํด๋์ค ๋ด๋ถ์์๋ง ์ฌ์ฉํ ๊ฒฝ์ฐ์๋ private์ผ๋ก ์ก๋ ๊ฒ์ด ์ข๋ค.
usedMemory -= 300;
if(usedMemory < 0) {
usedMemory = 0;
}
}
public int totalMemory() { return MAX_MEMORY; }
public int freeMemory() { return MAX_MEMORY - usedMemory; }
}
public class ThreadExam08 {
public static void main(String[] args) {
ThreadEx_08_1 t = new ThreadEx_08_1();
t.setDaemon(true);
t.start();
int requiredMemory = 0;
for(int i=0; i<20; i++) {
requiredMemory = (int)(Math.random() * 10) * 20; // 0๋ณด๋ค ๊ฐ๊ฑฐ๋ ํฌ๊ณ 200๋ณด๋ค ์์ ์ ์
// ํ์ํ memory๊ฐ ์ฌ์ฉํ ์ ์๋ ์๋ณด๋ค ํฌ๊ฑฐ๋
// ํ์ฌ ์ ์ฒด ๋ฉ๋ชจ๋ฆฌ์์ 60% ์ด์์ ์ฌ์ฉํ๊ณ ์์ ๋ gc๋ฅผ ์คํํ๋ค.
if(requiredMemory > t.freeMemory() || t.freeMemory() < t.totalMemory() * 0.4) {
t.interrupt(); // ์ฌ๊ธฐ์์๋ main thread๋ gc() ์คํ์ด ๋๋ ๋๊น์ง ๊ธฐ๋ค๋ฆฌ์ง ์๋๋ค.
try {
t.join(100); // ์ด ์ฝ๋๋ก main์ด gc() ์คํ์ ๊ธฐ๋ค๋ฆฌ๊ฒ ๋๋ค.
} catch (Exception e) {
}
}
t.usedMemory += requiredMemory;
System.out.println("์ฌ์ฉ๋ ๋ฉ๋ชจ๋ฆฌ๋ : " + t.usedMemory);
}
}
}
Math.random()
0.0๋ณด๋ค ๊ฐ๊ฑฐ๋ ํฌ๊ณ 1.0๋ณด๋ค ์์ ์ค์