Thread
๊ฐ๋
ํ๋ก์ธ์ค์ ์ค๋ ๋
ํ๋ก์ธ์ค : ์ด์์ฒด์ ์์ ์คํ ์ค์ธ ํ๋์ ์ ํ๋ฆฌ์ผ์ด์
์ฌ์ฉ์๊ฐ ์ ํ๋ฆฌ์ผ์ด์ ์ ์คํํ๋ฉด ์ด์์ฒด์ ๋ก๋ถํฐ ์คํ์ ํ์ํ ๋ฉ๋ชจ๋ฆฌ๋ฅผ ํ ๋น๋ฐ์ ์ ํ๋ฆฌ์ผ์ด์ ์ฝ๋๋ฅผ ์คํํ๋๋ฐ ์ด๊ฒ์ ํ๋ก์ธ์ค๋ผํ๋ค. ํ๋์ ์ ํ๋ฆฌ์ผ์ด์ ์ ๋ค์ค ํ๋ก์ธ์ค๋ฅผ ๋ง๋ค๊ธฐ๋ ํ๋ค.
์๋ฅผ๋ค์ด Chrome ๋ธ๋ผ์ฐ์ ๋ฅผ ๋๊ฐ ์คํํ๋ฉด ๋ ๊ฐ์ Chrome ํ๋ก์ธ์ค๊ฐ ์์ฑ๋ ๊ฒ์ด๋ค.
๋ฉํฐ ํ์คํน(multi tasking) : ๋ ๊ฐ์ง ์ด์์ ์์ ์ ๋์์ ์ฒ๋ฆฌํ๋ ๊ฒ
์ด์์ฒด์ ๋ ๋ฉํฐ ํ์คํน์ ํ ์ ์๋๋ก CPU ๋ฐ ๋ฉ๋ชจ๋ฆฌ ์์์ ํ๋ก์ธ์ค๋ง๋ค ์ ์ ํ๊ฒ ํ ๋นํด์ฃผ๊ณ , ๋ณ๋ ฌ๋ก ์คํ์ํจ๋ค. ๋ฉํฐ ํ์คํน์ ๊ผญ ๋ฉํฐ ํ๋ก์ธ์ค๋ฅผ ์๋ฏธํ์ง๋ ์๋๋ค. ํ ํ๋ก์ธ์ค ๋ด์์๋ ๋ฉํฐ ํ์คํน์ ํ ์ ์๋ค. ์) ๋ฉ์ ์ - ํ์ผ์ ์ก, ์ฑํ ๊ธฐ๋ฅ ๋์ ์ํ
๋ฉํฐ ์ค๋ ๋(multi thread) : ํ๋์ ํ๋ก์ธ์ค ๋ด์์์ ๋ฉํฐ ํ์คํน

๋ฉํฐ ํ๋ก์ธ์ค๋ ์ด์์ฒด์ ์์ ํ ๋น๋ฐ์ ์์ ์ ๋ฉ๋ชจ๋ฆฌ๋ฅผ ๊ฐ์ง๊ณ ์คํํ๊ธฐ ๋๋ฌธ์ ์๋ก ๋ ๋ฆฝ์ ์ด๋ค. ๋ฐ๋ผ์ ํ๋์ ํ๋ก์ธ์ค์์ ์ค๋ฅ๊ฐ ๋ฐ์ํด๋ ๋ค๋ฅธ ํ๋ก์ธ์ค์ ์ํฅ์ ๋ฏธ์น์ง ์๋๋ค.
๋ฉํฐ ์ค๋ ๋๋ ํ๋์ ํ๋ก์ธ์ค ๋ด๋ถ์ ์์ฑ๋๊ธฐ ๋๋ฌธ์ ํ๋์ ์ค๋ ๋๊ฐ ์์ธ๋ฅผ ๋ฐ์์ํค๋ฉด ํ๋ก์ธ์ค๊ฐ ์ข ๋ฃ๋ ์ ์์ด ๋ค๋ฅธ ์ค๋ ๋์ ์ํฅ์ ๋ฏธ์น๋ค. ๊ทธ๋ ๊ธฐ ๋๋ฌธ์ ๋ฉํฐ ์ค๋ ๋์์๋ ์์ธ์ฒ๋ฆฌ๋ฅผ ์ ๊ฒฝ์จ์ผํ๋ค.
๋ฉ์ธ ์ค๋ ๋
๋ชจ๋ ์๋ฐ ์ ํ๋ฆฌ์ผ์ด์
์ ๋ฉ์ธ ์ค๋ ๋(main thread)๊ฐ main()
๋ฉ์๋๋ฅผ ์คํํ๋ฉด์ ์์๋๋ค. ๋ฉ์ธ ์ค๋ ๋๋ main() ๋ฉ์๋์ ์ฒซ ์ฝ๋๋ถํฐ ์๋๋ก ์์ฐจ์ ์ผ๋ก ์คํํ๊ณ ,main()์ ๋ง์ง๋ง ์ฝ๋๋ฅผ ์คํํ๊ฑฐ๋ return ๋ฌธ์ ๋ง๋๋ฉด ์ข
๋ฃ๋๋ค.
๋ฉ์ธ ์ค๋ ๋๋ ํ์์ ๋ฐ๋ผ ์์ ์ค๋ ๋๋ฅผ ์์ฑํด ๋ณ๋ ฌ๋ก ์ฝ๋๋ฅผ ์คํํ ์ ์๋ค. ์ฆ, ๋ฉํฐ ์ค๋ ๋๋ฅผ ์์ฑํด ๋ฉํฐ ํ์คํน์ ์ํํ๋ค. ์ฑ๊ธ ์ค๋ ๋ ์ดํ๋ฆฌ์ผ์ด์ ์์๋ ๋ฉ์ธ ์ค๋ ๋๊ฐ ์ข ๋ฃ๋๋ฉด ํ๋ก์ธ์ค๋ ์ข ๋ฃ๋๋ค. ํ์ง๋ง ๋ฉํฐ ์ค๋ ๋ ์ ํ๋ฆฌ์ผ์ด์ ์์๋ ์คํ ์ค์ธ ์ค๋ ๋๊ฐ ํ๋๋ผ๋ ์๋ค๋ฉด, ํ๋ก์ธ์ค๋ ์ข ๋ฃ๋์ง ์๋๋ค.
์์
์ค๋ ๋ ์์ฑ๊ณผ ์คํ
๋ฉํฐ ์ค๋ ๋๋ก ์คํํ๋ ์ ํ๋ฆฌ์ผ์ด์ ์ ๊ฐ๋ฐํ๋ ค๋ฉด ๋จผ์ ๋ช ๊ฐ์ ์์ ์ ๋ณ๋ ฌ๋ก ์คํํ ์ง ๊ฒฐ์ ํ๊ณ , ๊ฐ ์์ ๋ณ๋ก ์ค๋ ๋๋ฅผ ์์ฑํด์ผํ๋ค. ์๋ฐ์์๋ ์์ ์ค๋ ๋๋ก ๊ฐ์ฒด๋ก ์์ฑ๋๊ธฐ ๋๋ฌธ์ ํด๋์ค๊ฐ ํ์ํ๋ค.
java.lang.Thread ํด๋์ค๋ฅผ ์ง์ ๊ฐ์ฒดํํด์ ์์ฑ
Thread๋ฅผ ์์ํด ํ์ ํด๋์ค๋ก ์์ฑ
Thread ํด๋์ค๋ก๋ถํฐ ์ง์ ์์ฑ
java.lang.Thread ํด๋์ค๋ฅผ ์ง์ ๊ฐ์ฒดํํด์ ์์ฑํ๋ ค๋ฉด Runnable ์ ๋งค๊ฐ๊ฐ์ผ๋ก ๊ฐ๋ ์์ฑ์๋ฅผ ํธ์ถํด์ผํ๋ค.
Thread thread = new Thread(Runnable target);
Runnable์ ์์ ์ค๋ ๋๊ฐ ์คํํ ์ ์๋ ์ฝ๋๋ฅผ ๊ฐ์ง๊ณ ์๋ ๊ฐ์ฒด๋ผ๊ณ ํด์ ๋ถ์ฌ์ง ์ด๋ฆ์ด๋ค. Runnable์ ์ธํฐํ์ด์ค ํ์ ์ด๊ธฐ ๋๋ฌธ์ ๊ตฌํ ๊ฐ์ฒด๋ฅผ ๋ง๋ค์ด์ ๋์ ํด์ผํ๋ค. Runnable์ ์ธํฐํ์ด์ค ํ์ ์ด๋ฏ๋ก ๊ตฌํ ๊ฐ์ฒด๋ฅผ ๋ง๋ค์ด์ผํ๋ค. Runnable ์๋ run() ๋ฉ์๋๊ฐ ์ ์๋์ด์๋ค.
class Task implements Runnable{
@Override
public void run(){
// ์ค๋ ๋๊ฐ ์คํํ ์ฝ๋;
}
}
Runnable task = new Task();
Thread thread = new Thread(task);
Runnable์ ์์ ๋ด์ฉ์ ๊ฐ์ง๊ณ ์๋ ๊ฐ์ฒด์ด์ง ์ค์ ์ค๋ ๋๋ ์๋๋ค. ๊ทธ๋ฌ๋ฏ๋ก Runnable ๊ตฌํ ๊ฐ์ฒด๋ฅผ ์์ฑํ ํ์ ์ด๊ฒ์ ๋งค๊ฐ๊ฐ์ผ๋ก ํด์ Thread ์์ฑ์๋ฅผ ํธ์ถํ๋ฉด ์์ ์ค๋ ๋๊ฐ ์์ฑ๋๋ค.
Thread thread = new Thread(new Runnable(){
public void run(){
//์ค๋ ๋๊ฐ ์คํํ ์ฝ๋;
}
});
์คํ๋ ค ์ด ๋ฐฉ๋ฒ์ด ๋ ๋ง์ด ์ฌ์ฉ๋๋ค.
Thread thread = new Thread(()->{
//์ค๋ ๋๊ฐ ์คํํ ์ฝ๋;
});
Runnable ์ธํฐํ์ด์ค๋ run()๋ฉ์๋ ํ๋๋ง ์ ์ ๋์ด์๊ธฐ ๋๋ฌธ์ ํจ์์ ์ธํฐํ์ด์ค์ด๋ค. ๋ฐ๋ผ์ ๋ค์๊ณผ ๊ฐ์ด ๋๋ค์์ ๋งค๊ฐ๊ฐ์ผ๋ก ์ฌ์ฉํ ์ ์๋ค.(์๋ฐ 8๋ถํฐ ์ง์)
์์ ์ค๋ ๋๋ ์์ฑ๋๋ ์ฆ์ ์คํ๋์ง ์๋๋ค. start() ๋ฉ์๋๋ฅผ ํธ์ถํด์ผ๋ง ์คํ๋๋ค.
thread.start();
์์
0.5 ์ด ์ฃผ๊ธฐ๋ก beep์์ ๋ฐ์์ํค๋ฉด์ ๋์์ ํ๋ฆฐํ ํ๋ ์์
package chap12;
import java.awt.Toolkit;
public class BeepPrintEx {
public static void main(String[] args) {
// TODO Auto-generated method stub
Toolkit tk = Toolkit.getDefaultToolkit();
for(int i=0;i<5;i++) {
tk.beep();
try {
// 0.5์ด๋ง๋ค ๋นํ์ ๋ฐ
Thread.sleep(500);
} catch (Exception e) {
// TODO: handle exception
}
}
for(int i=0;i<5;i++) {
System.out.println("๋ต");
try {
// 0.5์ด๋ง๋ค ๋นํ์ ๋ฐ์
Thread.sleep(500);
} catch (Exception e) {
// TODO: handle exception
}
}
}
}
์ด๋ ๊ฒ ํ๋ ๊ฒฝ์ฐ Beep์์ด ๋ฐ์ํ ํ "๋ต"์ด๋ผ๋ ๊ธ์๊ฐ print ๋๋ค. ๋์์ ์์ ์ ํ๋ ค๋ฉด ๋ ์์ ์ค ํ๊ฐ๋ฅผ ๋ฉ์ธ ์ค๋ ๋๊ฐ ์๋ ๋ค๋ฅธ ์ค๋ ๋์์ ์คํ์์ผ์ค์ผํ๋ค.
๋ฐฉ๋ฒ1
package chap12;
import java.awt.Toolkit;
public class BeepTask implements Runnable {
@Override
public void run() {
// TODO Auto-generated method stub
Toolkit tk = Toolkit.getDefaultToolkit();
for(int i=0;i<5;i++) {
tk.beep();
try {
// 0.5์ด๋ง๋ค ๋นํ์ ๋ฐ์
Thread.sleep(500);
} catch (Exception e) {
// TODO: handle exception
}
}
}
}
package chap12;
import java.awt.Toolkit;
public class BeepPrintEx {
public static void main(String[] args) {
// TODO Auto-generated method stub
Runnable beepTask = new BeepTask();
Thread thread = new Thread(beepTask);
thread.start();
for(int i=0;i<5;i++) {
System.out.println("๋ต");
try {
// 0.5์ด๋ง๋ค ๋นํ์ ๋ฐ
Thread.sleep(500);
} catch (Exception e) {
// TODO: handle exception
}
}
}
}
๋ฐฉ๋ฒ2
package chap12;
import java.awt.Toolkit;
public class BeepPrintEx {
public static void main(String[] args) {
Thread thread = new Thread(new Runnable() {
@Override
public void run() {
Toolkit tk = Toolkit.getDefaultToolkit();
for(int i=0;i<5;i++) {
tk.beep();
try {
Thread.sleep(500);
} catch (Exception e) {
}
}
}
});
thread.start();
for(int i=0;i<5;i++) {
System.out.println("๋ต");
try {
Thread.sleep(500);
} catch (Exception e) {
}
}
}
}
๋ฐฉ๋ฒ3
package chap12;
import java.awt.Toolkit;
public class BeepPrintEx {
public static void main(String[] args) {
Thread thread = new Thread(()-> {
Toolkit tk = Toolkit.getDefaultToolkit();
for(int i=0;i<5;i++) {
tk.beep();
try {
Thread.sleep(500);
} catch (Exception e) {
}
}
});
thread.start();
for(int i=0;i<5;i++) {
System.out.println("๋ต");
try {
// 0.5์ด๋ง๋ค ๋นํ์ ๋ฐ
Thread.sleep(500);
} catch (Exception e) {
// TODO: handle exception
}
}
}
}
Thread ํ์ ํด๋์ค๋ก๋ถํฐ ์์ฑ
์์ ์ค๋ ๋๊ฐ ์คํํ ์์ ์ Runnable๋ก ๋ง๋ค์ง ์๊ณ , Thread ํ์ ํด๋์ค๋ก ์์ ์ค๋ ๋๋ฅผ ์ ์ํ๋ฉด์ ์์ ๋ด์ฉ์ ํฌํจํ ์ ์๋ค.
public class TaskThread extends Thread{
@Override
public void run(){
// ์ค๋ ๋๊ฐ ์คํํ ์ฝ๋
}
}
Thread thread = new TaskThread();
์ฝ๋๋ฅผ ์ ์ฝํ๊ธฐ ์ํด์ ์ต๋ช ๊ฐ์ฒด๋ก ์์ ์ค๋ ๋ ๊ฐ์ฒด๋ฅผ ์์ฑํ ์ ์๋ค.
Thread thread = new Thread(){
public void run(){
//์ค๋ ๋๊ฐ ์คํํ ์ฝ๋
}
}
์ด๋ ๊ฒ ์์ฑํ ์ค๋ ๋์ .start()
๋ฅผ ํด์ฃผ๋ฉด ์์
์ค๋ ๋๋ ์์ ์ run() ๋ฉ์๋๋ฅผ ์คํํ๋ค.
์์
package chap12;
import java.awt.Toolkit;
public class BeepThread extends Thread{
@Override
public void run() {
// TODO Auto-generated method stub
Toolkit tk = Toolkit.getDefaultToolkit();
for(int i=0;i<5;i++) {
tk.beep();
try {
// 0.5์ด๋ง๋ค ๋นํ์ ๋ฐ
Thread.sleep(500);
} catch (Exception e) {
// TODO: handle exception
}
}
}
}
package chap12;
import java.awt.Toolkit;
public class BeepPrintEx {
public static void main(String[] args) {
Thread thread = new BeepThread();
thread.start();
for(int i=0;i<5;i++) {
System.out.println("๋ต");
try {
// 0.5์ด๋ง๋ค ๋นํ์ ๋ฐ
Thread.sleep(500);
} catch (Exception e) {
// TODO: handle exception
}
}
}
}
๋ฐฉ๋ฒ2
package chap12;
import java.awt.Toolkit;
public class BeepPrintEx {
public static void main(String[] args) {
Thread thread = new Thread(){
public void run() {
// TODO Auto-generated method stub
Toolkit tk = Toolkit.getDefaultToolkit();
for(int i=0;i<5;i++) {
tk.beep();
try {
// 0.5์ด๋ง๋ค ๋นํ์ ๋ฐ
Thread.sleep(500);
} catch (Exception e) {
// TODO: handle exception
}
}
}
}
thread.start();
for(int i=0;i<5;i++) {
System.out.println("๋ต");
try {
// 0.5์ด๋ง๋ค ๋นํ์ ๋ฐ
Thread.sleep(500);
} catch (Exception e) {
// TODO: handle exception
}
}
}
}
์ค๋ ๋ ์ด๋ฆ
์ค๋ ๋๋ ์์ ์ ์ด๋ฆ์ ๊ฐ์ง๊ณ ์๋ค. ํฐ ์ญํ ์ ํ๋ ๊ฒ์ ์๋์ง๋ง, ๋๋ฒ๊น
ํ ๋ ์ด๋ค ์ค๋ ๋๊ฐ ์ด๋ค ์์
์ ํ๋์ง ํ์ธํ ๋ ์ฌ์ฉ๋๋ค. ๋ฉ์ธ ์ค๋ ๋๋ "main"์ด๋ผ๋ ์ด๋ฆ์ ๊ฐ์ง๊ณ ์๊ณ , ์ฐ๋ฆฌ๊ฐ ์ง์ ์์ฑํ ์ค๋ ๋๋ ์๋์ ์ผ๋ก "Thread-n" ๋ก ์ด๋ฆ์ด ์ค์ ๋๋ค. ๋ง์ฝ ๋ค๋ฅธ ์ด๋ฆ์ผ๋ก ์ค์ ํ๊ณ ์ถ๋ค๋ฉด setName()
๋ฉ์๋๋ก ๋ณ๊ฒฝํ ์ ์๋ค.
thread.setName("์ค๋ ๋ ์ด๋ฆ");
๋ฐ๋๋ก ์ค๋ ๋ ์ด๋ฆ์ ์๊ณ ์ถ๋ค๋ฉด getName()
์ผ๋ก ๋ฐ์์ฌ ์ ์๋ค.
thread.getName();
setName()๊ณผ getName()์ Thread ์ธ์คํด์ค ๋ฉ์๋์ฌ์ ์ค๋๋ ๊ฐ์ฒด์ ์ฐธ์กฐ๊ฐ ํ์ํ๋ค. ์ค๋ ๋ ๊ฐ์ฒด๋ฅผ ์ฐธ์กฐํ๊ณ ์์ง ์๋ค๋ฉด currentThread() ์ ์ ๋ฉ์๋๋ก ์ฐธ์กฐ๋ฅผ ์ป์ ์ ์๋ค.
Thread thread = Thread.currentThread();
์ค๋ ๋ ์ฐ์ ์์

์ค๋ ๋๋ ๋์์ฑ(concurrency) ๋๋ ๋ณ๋ ฌ์ฑ(parallelism)์ผ๋ก ์คํ๋๋ค.
๋์์ฑ : ๋ฉํฐ ์์ ์ ์ํด ํ๋์ ์ฝ์ด์์ ๋ฉํฐ ์ค๋ ๋๊ฐ ๋ฒ๊ฐ์๊ฐ๋ฉฐ ์คํ๋๋ ์ฑ์ง
๋ณ๋ ฌ์ฑ : ๋ฉํฐ ์์ ์ ์ํด ๋ฉํฐ ์ฝ์ด์์ ๊ฐ๋ณ ์ค๋ ๋๋ฅผ ๋์์ ์คํํ๋ ์ฑ์ง
์ค๋ ๋ ์๊ฐ ์ฝ์ด์ ์๋ณด๋ค ๋ง์ ๊ฒฝ์ฐ์ ์ค๋ ๋๋ฅผ ์ด๋ค ์์์ ์ํด ๋์์ฑ์ผ๋ก ์คํํ ๊ฒ์ธ์ง ๊ฒฐ์ ํด์ผํ๋ค. ์ด๊ฒ์ ์ค๋ ๋ ์ค์ผ์ฅด๋ง์ด๋ผ ํ๋ค. ์ค๋ ๋ ์ค์ผ์ค๋ง์ ์ํด ์ค๋ ๋๋ค์ ์์ฃผ ์งง์ ์๊ฐ์ ๋ฒ๊ฐ์๊ฐ๋ฉด์ run() ๋ฉ์๋๋ฅผ ์กฐ๊ธ์ฉ ์ํํ๋ค.
์๋ฐ์์ ์ค๋ ๋ ์ค์ผ์ค๋ง์ ์ฐ์ ์์(Priority) ๋ฐฉ์๊ณผ ์ํ ํ ๋น(Round-Robin) ๋ฐฉ์์ ์ฌ์ฉํ๋ค.
์ฐ์ ์์ : ์ฐ์ ์์๊ฐ ๋์ ์ค๋ ๋๊ฐ ์คํ ์ํ๋ฅผ ๋ ๋ง์ด ๊ฐ์ง๋๋ก ์ค์ผ์ค๋ง ํ๊ฒ
์ํ ํ ๋น : ์๊ฐ ํ ๋น๋(Time Slice)์ ์ ํด์ ํ๋์ ์ค๋ ๋๋ฅผ ์ ํด์ง ์๊ฐ๋งํผ ์คํํ๊ณ ๋ค์ ๋ค๋ฅธ ์ค๋ ๋๋ฅผ ์คํํ๋ ๋ฐฉ์
์ฐ์ ์์ ๋ฐฉ์์ ์ค๋๋ ๊ฐ์ฒด์ ์ฐ์ ์์ ๋ฒํธ๋ฅผ ๋ถ์ฌํ ์ ์๊ธฐ๋๋ฌธ์ ๊ฐ๋ฐ์๊ฐ ์ฝ๋๋ก ์ ์ดํ ์ ์์ผ๋, ์ํ ํ ๋น ๋ฐฉ์์ ์๋ฐ ๊ฐ์ ๊ธฐ๊ณ์ ์ํด์ ์ ํด์ง๊ธฐ ๋๋ฌธ์ ์ฝ๋๋ก ์ ์ดํ ์ ์๋ค.
์ฐ์ ์์ ๋ฐฉ์์์ ์ฐ์ ์์๋ 1(๊ฐ์ฅ ๋ฎ์ ์ฐ์ ์์)~10(๊ฐ์ฅ ๋์ ์ฐ์ ์์)๊น์ง ๋ถ์ฌ๋๋ค. ์ฐ์ ์์๋ฅผ ๋ถ์ฌํ์ง ์์ผ๋ฉด ๋ชจ๋ ์ค๋ ๋๋ค์ ๊ธฐ๋ณธ์ ์ผ๋ก 5์ ์ฐ์ ์์๋ฅผ ํ ๋น๋ฐ๋๋ค.
thread.setPriority(์ฐ์ ์์);
setPriority()
๋ฉ์๋๋ฅผ ์ด์ฉํด์ ์ฐ์ ์์๋ฅผ ์ค ์ ์๋ค. 1~10์ ๊ฐ์ ์ง์ ์ฃผ์ด๋ ๋์ง๋ง, ์ฝ๋์ ๊ฐ๋
์ฑ์ ๋์ด๊ธฐ ์ํด ํด๋์ค ์์๋ฅผ ์ฌ์ฉํ ์๋ ์๋ค.
thread.setPriority(Thread.MAX_PRIORITY); // 10
thread.setPriority(Thread.NORM_PRIORITY); // 5
thread.setPriority(Thread.MIN_PRIORITY); // 1
์์
package chap12;
public class PriorityEx {
public static void main(String[] args) {
// TODO Auto-generated method stub
for(int i=1;i<=10;i++) {
Thread thread = new CalcThread("thread"+i);
if(i==10) {
thread.setPriority(Thread.MAX_PRIORITY);
}else {
thread.setPriority(Thread.MIN_PRIORITY);
}
thread.start();
}
}
}
package chap12;
public class CalcThread extends Thread{
public CalcThread(String name) {
// ์ค๋ ๋ ์ด๋ฆ ์ค์
setName(name);
}
@Override
public void run() {
for(int i=0;i<2000000000;i++) {
}
System.out.println(getName());
}
}
๋๊ธฐํ ๋ฉ์๋์ ๋๊ธฐํ ๋ธ๋ก
๊ณต์ ๊ฐ์ฒด๋ฅผ ์ฌ์ฉํ ๋ ์ฃผ์ํ ์
์ฑ๊ธ ์ค๋ ๋ ํ๋ก๊ทธ๋จ์์๋ ํ ๊ฐ์ ์ค๋ ๋๊ฐ ๊ฐ์ฒด๋ฅผ ๋ ์ฐจ์งํด์ ์ฌ์ฉํ๋ฉด ๋์ง๋ง, ๋ฉํฐ ์ค๋ ๋ ํ๋ก๊ทธ๋จ์์๋ ์ค๋ ๋๋ค์ด ๊ฐ์ฒด๋ฅผ ๊ณต์ ํด์ ์์ ํด์ผํ๋ ๊ฒฝ์ฐ๊ฐ ์๋ค. ์ด๋ฌํ ๊ฒฝ์ฐ์ ์ค๋ ๋ A๋ฅผ ์ฌ์ฉํ๋ ๊ฐ์ฒด๊ฐ ์ค๋ ๋ B์ ์ํด์ ์ํ๊ฐ ๋ณ๊ฒฝ๋ ์ ์๊ธฐ ๋๋ฌธ์ ์ค๋ ๋ A๊ฐ ์๋ํ๋ ๊ฒ๊ณผ ๋ค๋ฅธ ๊ฒฐ๊ณผ๋ฅผ ์ฐ์ถํ ์ ์๋ค.
package chap12;
public class Main {
public static void main(String[] args) {
// TODO Auto-generated method stub
Calculator calculator = new Calculator();
User1 user1 = new User1();
user1.setCalculator(calculator);
user1.start();
User2 user2 = new User2();
user2.setCalculator(calculator);
user2.start();
}
}
package chap12;
public class Calculator {
private int memory;
public int getMemory() {
return memory;
}
public void setMemory(int memory) {
this.memory = memory;
try {
Thread.sleep(2000);
} catch (Exception e) {
// TODO: handle exception
}
System.out.println(Thread.currentThread().getName() + ": "+this.memory);
}
}
package chap12;
public class User1 extends Thread{
private Calculator calculator;
public void setCalculator(Calculator calculator) {
this.setName("USER1");
this.calculator = calculator;
}
@Override
public void run() {
// TODO Auto-generated method stub
calculator.setMemory(100);
}
}
package chap12;
public class User2 extends Thread{
private Calculator calculator;
public void setCalculator(Calculator calculator) {
this.setName("USER2");
this.calculator = calculator;
}
@Override
public void run() {
// TODO Auto-generated method stub
calculator.setMemory(50);
}
}
USER1: 50
USER2: 50
User1 ์ค๋ ๋๊ฐ Calculator ๊ฐ์ฒด์ memory ํ๋์ 100์ ์ ์ฅํ๊ณ 2์ด๊ฐ ๋ฉ์ถ ์ํ๊ฐ๋๋ค. ๊ทธ๋์์ User2๊ฐ memory๊ฐ์ 50์ผ๋ก ๋ณ๊ฒฝํ๋ค. User1์ด 2์ด๊ฐ ์ง๋๊ณ memory ํ๋์ ๊ฐ์ ์ถ๋ ฅํ๋ฉด 50์ด ๋์ค๋ ๊ฒ์ ๋ณผ ์ ์๋ค.
๋๊ธฐํ ๋ฉ์๋ ๋ฐ ๋๊ธฐํ ๋ธ๋ก
์ค๋ ๋๊ฐ ์ฌ์ฉ ์ค์ธ ๊ฐ์ฒด๋ฅผ ๋ค๋ฅธ ์ค๋ ๋๊ฐ ๋ณ๊ฒฝํ ์ ์๋๋ก ํ๋ ค๋ฉด ์ค๋ ๋ ์์ ์ด ๋๋ ๋๊น์ง ๊ฐ์ฒด์ ๋ค๋ฅธ ์ค๋ ๋๊ฐ ์ ๊ทผํ ์ ์๋๋ก ํด์ผํ๋ค. ๋ฉํฐ ์ค๋ ๋ ํ๋ก๊ทธ๋จ์์ ๋จ ํ๋์ ์ค๋ ๋๋ง ์คํํ ์ ์๋ ์ฝ๋ ์์ญ์ ์๊ณ ์์ญ(critical section)์ด๋ผ๊ณ ํ๋ค. ์๋ฐ์์ ์๊ณ ์์ญ์ ์ง์ ํ๊ธฐ ์ํด์ ๋๊ธฐํ(synchronized) ๋ฉ์๋์ ๋๊ธฐํ ๋ธ๋ก์ ์ ๊ณตํ๋ค. ์ค๋ ๋๊ฐ ๊ฐ์ฒด ๋ด๋ถ์ ๋๊ธฐํ ๋ฉ์๋ ํน์ธ ๋ธ๋ก์ ๋ค์ด๊ฐ๋ฉด ์ฆ์ ๊ฐ์ฒด์ ์ ๊ธ์ ๊ฑธ์ด์ ๋ค๋ฅธ ์ค๋ ๋๊ฐ ์๊ณ์์ญ์ฝ๋๋ฅผ ์คํํ์ง ๋ชปํ๋๋ก ํ๋ค.
public synchronized void method(){
//์๊ณ์์ญ, ๋จ ํ๋์ ์ค๋ ๋๋ง ์คํ
}
๋๊ธฐํ ๋ฉ์๋๋ ๋ฉ์๋ ์ ์ฒด ๋ด์ฉ์ด ์๊ณ์์ญ์ด๋ฏ๋ก ์ค๋ ๋๊ฐ ๋๊ธฐํ ๋ฉ์๋๋ฅผ ์คํํ๋ ์ฆ์ ๊ฐ์ฒด์๋ ์ ๊ธ์ด ์ผ์ด๋๊ณ , ์ค๋ ๋๊ฐ ๋๊ธฐํ ๋ฉ์๋๋ฅผ ์ข ๋ฃํ๋ฉด ์ ๊ธ์ด ํ๋ฆฐ๋ค.
๋ฉ์๋ ์ ์ฒด๊ฐ ์๋๋ผ ์ผ๋ถ๋ง ์๊ณ์์ญ์ผ๋ก ๋ง๋ค ์๋ ์๋ค.
public void method(){
//์ฌ๋ฌ์ค๋ ๋๊ฐ๋ฅ
synchronized(๊ณต์ ๊ฐ์ฒด){
//์๊ณ์์ญ
}
// ์ฌ๋ฌ ์ค๋ ๋ ์คํ ๊ฐ๋ฅ
}
์์
package chap12;
public class Calculator {
private int memory;
public int getMemory() {
return memory;
}
public synchronized void setMemory(int memory) {
this.memory = memory;
try {
Thread.sleep(2000);
} catch (Exception e) {
// TODO: handle exception
}
System.out.println(Thread.currentThread().getName() + ": "+this.memory);
}
}
USER1: 100
USER2: 50
๋๊ธฐํ๋ฉ์๋๋ก ๋ฐ๊พผ ๊ฒฐ๊ณผ user1์ 100, user2๋ 50์ด ๋์ค๋ ๊ฒ์ ๋ณผ ์ ์๋ค.
package chap12;
public class Calculator {
private int memory;
public int getMemory() {
return memory;
}
public void setMemory(int memory) {
synchronized (this) {
this.memory = memory;
try {
Thread.sleep(2000);
} catch (Exception e) {
// TODO: handle exception
}
System.out.println(Thread.currentThread().getName() + ": "+this.memory);
}
}
}
๋ค์๊ณผ ๊ฐ์ด ๋๊ธฐํ ๋ธ๋ก์ผ๋ก๋ ๋ง๋ค ์ ์๋ค.
์ค๋ ๋ ์ํ
์ค๋ ๋ ๊ฐ์ฒด๋ฅผ ์์ฑ(New)ํ๊ณ , start() ๋ฉ์๋๋ฅผ ํธ์ถํ๋ฉด ๊ณง๋ฐ๋ก ์ค๋ ๋๊ฐ ์คํ๋๋ ๊ฒ์ฒ๋ผ ๋ณด์ด์ง๋ง ์ฌ์ค์ ์คํ ๋๊ธฐ ์ํ(Runnable)๊ฐ๋๋ค.
์คํ๋๊ธฐ์ํ : ์์ง ์ค์ผ์ค๋ง์ด ๋์ง ์์์ ์คํ์ ๊ธฐ๋ค๋ฆฌ๊ณ ์๋ ์ํ
์คํ ๋๊ธฐ ์ํ์ ์๋ ์ค๋ ๋ ์ค์์ ์ค๋ ๋ ์ค์ผ์ค๋ง์ผ๋ก ์ ํ๋ ์ค๋ ๋๊ฐ ๋น๋ก์ CPU๋ฅผ ์ ์ ํ๊ณ run()๋ฉ์๋๋ฅผ ์คํํ๋ค. ์ด๋๋ฅผ ์คํ์ํ(Running) ๋ผ๊ณ ํ๋ค.
์คํ ์ํ์ ์ค๋ ๋๋ run() ๋ฉ์๋๋ฅผ ๋ชจ๋ ์คํํ๊ธฐ ์ ์ ์ค๋ ๋ ์ค์ผ์ค๋ง์ ์ํด์ ๋ค์ ๋๊ธฐ ์ํ๋ก ๋์๊ฐ ์ ์๋ค. ๊ทธ๋ฆฌ๊ณ ์คํ ๋๊ธฐ ์ํ์ ์๋ ๋ค๋ฅธ ์ค๋ ๋๊ฐ ์ ํ๋์ด ์คํ ์ํ๊ฐ๋๋ค. ์ด๋ ๊ฒ ์ค๋ ๋๋ ์คํ ๋๊ธฐ ์ํ์ ์คํ ์ํ๋ฅผ ๋ฒ๊ฐ์๊ฐ๋ฉด์ ์์ ์ run() ๋ฉ์๋๋ฅผ ์กฐ๊ธ์ฉ ์ํํ๋ค.
๋ ์ด์ ์คํํ ์ฝ๋๊ฐ ์์ผ๋ฉด ์ค๋ ๋์ ์คํ์ ๋ฉ์ถ๊ฒ๋๊ณ ์ด ์ํ๋ฅผ ์ข ๋ฃ์ํ(Dead, Termianted) ๋ผ๊ณ ํ๋ค.
๊ฒฝ์ฐ์ ๋ฐ๋ผ์ ์ค๋ ๋๋ ์คํ ์ํ์์ ์ผ์ ์ ์ง ์ํ๋ก ๊ฐ๊ธฐ๋ํ๋ค.
์ผ์์ ์ง์ํ : ์ค๋ ๋๊ฐ ์คํํ ์ ์๋ ์ํ
WAITING
TIMED_WAITING
BLOCKED
์ค๋ ๋๊ฐ ์ผ์์ ์ง์ํ์์ ๋ค์ ์คํ์ํ๋ก ๊ฐ๊ธฐ ์ํด์๋ ์คํ๋๊ธฐ์ํ๋ก ๊ฐ์ผํ๋ค.
getState()
์ค๋ ๋์ ์ํ๋ฅผ ์ฝ๋์์ ํ์ธํ ์ ์๋ ๋ฉ์๋์ด๋ค.
์ํ
์ด๊ฑฐ์์
์ค๋ช
๊ฐ์ฒด ์์ฑ
NEW
์ค๋ ๋ ๊ฐ์ฒด๊ฐ ์์ฑ, ์์ง start() ๋ฉ์๋ ํธ์ถ์ ์ํ
์คํ ๋๊ธฐ
RUNNABLE
์คํ ์ํ๋ก ์ธ์ ๋ ์ง ๊ฐ ์ ์๋ ์ํ
์ผ์์ ์ง
WAITING
๋ค๋ฅธ ์ค๋ ๋๊ฐ ํต์งํ ๋๊น์ง ๊ธฐ๋ค๋ฆฌ๋ ์ํ
TIMED_WAITING
์ฃผ์ด์ง ์๊ฐ๋์ ๊ธฐ๋ค๋ฆฌ๋ ์ํ
BLOCKED
์ฌ์ฉํ๊ณ ์ ํ๋ ๊ฐ์ฒด์ ๋ฝ์ด ํ๋ฆด ๋๊น์ง ๊ธฐ๋ค๋ฆฌ๋ ์ํ
์ข ๋ฃ
TERMINATED
์คํ์ ๋ง์น ์ํ
์ค๋ ๋ ์ํ ์ ์ด
์คํ์ค์ธ ์ค๋ ๋์ ์ํ๋ฅผ ๋ณ๊ฒฝํ๋ ๊ฒ์ ์ค๋ ๋ ์ํ ์ ์ด๋ผํ๋ค.
์ํ ์ ์ด ๋ฉ์๋
๋ฉ์๋
์ค๋ช
interrupt()
์ผ์ ์ ์ง ์ํ์ ์ค๋ ๋์์ InterruptedException ์์ธ๋ฅผ ๋ฐ์์์ผ์ ์์ธ ์ฒ๋ฆฌ ์ฝ๋(catch)์์ ์คํ ๋๊ธฐ ์ํ ํน์ ์ข ๋ฃ ์ํ๋ก ๊ฐ ์ ์๋๋กํ๋ค.
notify() notifyAll()
๋๊ธฐํ ๋ธ๋ก ๋ด์์ wait() ๋ฉ์๋์ ์ํด ์ผ์ ์ ์ง ์ํ์ ์๋ ์ค๋ ๋๋ฅผ ์คํ ๋๊ธฐ ์ํ๋ก ๋ง๋ ๋ค.
sleep(long millis) sleep(long millis, int nanos)
์ฃผ์ด์ง ์๊ฐ๋์ ๋ฉ์๋์ ์ํด ์ผ์ ์ ์ง ์ํ์ ์๋ ์ค๋ ๋๋ฅผ ์คํ ๋๊ธฐ ์ํ๋ก ๋ง๋ ๋ค.
join() join(long millis) join(long millis, int nanos)
join() ๋ฉ์๋๋ฅผ ํธ์ถํ ์ค๋ ๋๋ ์ผ์ ์ ์ง ์ํ๊ฐ ๋๋ค. ๋ค์ ๋๊ธฐ ์ํ๋ก ๊ฐ๋ ค๋ฉด, join()๋ฉ์๋๋ฅผ ๋ฉค๋ฒ๋ก ๊ฐ์ง๋ ์ค๋ ๋๊ฐ ์ข ๋ฃ๋๊ฑฐ๋, ๋งค๊ฐ๊ฐ์ผ๋ก ์ฃผ์ด์ง ์๊ฐ์ด ์ง๋์ผํ๋ค.
wait() wait(long millis) wait(long millis, int nanos)
๋๊ธฐํ(synchronized) ๋ธ๋ก ๋ด์์ ์ค๋ ๋๋ฅผ ์ผ์ ์ ์ง ์ํ๋ก ๋ง๋ ๋ค. ๋งค๊ฐ๊ฐ์ผ๋ก ์ฃผ์ด์ง ์๊ฐ์ด ์ง๋๋ฉด ์๋์ ์ผ๋ก ์คํ ๋๊ธฐ ์ํ๊ฐ ๋๋ค. ์๊ฐ์ด ์ฃผ์ด์ง์ง ์์ผ๋ฉด notify(), notifyAll() ๋ฉ์๋์ ์ํด์ ์คํ ๋๊ธฐ ์ํ๋ก ๊ฐ ์ ์๋ค.
yield()
์คํ ์ค์ ์ฐ์ ์์๊ฐ ๋์ผํ ๋ค๋ฅธ ์ค๋ ๋์๊ฒ ์คํ์ ์๋ณดํ๊ณ ์คํ ๋๊ธฐ ์ํ๊ฐ ๋๋ค.
sleep() : ์ฃผ์ด์ง ์๊ฐ๋์ ์ผ์ ์ ์ง
์คํ ์ค์ธ ์ค๋ ๋๋ฅผ ์ผ์ ์๊ฐ ๋ฉ์ถ๊ฒ ํ ๋ ์ฌ์ฉํ๋ Thread ์ ์ ๋ฉ์๋์ด๋ค.
try{
Thread.sleep(1000);
}catch(InterruptedException e){
// interrupt() ๋ฉ์๋๊ฐ ํธ์ถ๋๋ฉด ์คํ
}
๋งค๊ฐ๊ฐ์๋ ์ผ๋ง ๋์ ์ผ์ ์ ์ง ์ํ๋ก ์์ ๊ฒ์ธ์ง, ๋ฐ๋ฆฌ์ธ์ปจ๋(1/1000) ๋จ์๋ก ์๊ฐ์ ์ฃผ๋ฉด ๋๋ค.
์ผ์ ์ ์ง ์ํ์์ ์ฃผ์ด์ง ์๊ฐ์ด ๋๋๊ธฐ ์ ์ interrupt() ๋ฉ์๋๊ฐ ํธ์ถ๋๋ฉด InterruptedException์ด ๋ฐ์ํ๊ธฐ ๋๋ฌธ์ ์์ธ ์ฒ๋ฆฌ๊ฐ ํ์ํ๋ค.
yield() : ๋ค๋ฅธ ์ค๋ ๋์๊ฒ ์คํ ์๋ณด
์ค๋ ๋๊ฐ ์ฒ๋ฆฌํ๋ ์์ ์ ๋ฐ๋ณต์ ์ธ ์คํ์ ์ํด์ for๋ฌธ์ด๋ while ๋ฌธ์ ํฌํจํ๋ ๊ฒฝ์ฐ๊ฐ ๋ง๋ค.
public void run(){
while(true){
if(work){
System.out.println("Thread1 ์์
๋ด์ฉ");
}
}
}
์ด ์ฝ๋์์ ์ค๋ ๋๊ฐ ์์๋์ด run() ๋ฉ์๋๋ฅผ ์คํํ๋ฉด while๋ฌธ์ ๋ฌดํ ๋ฐ๋ณต ์คํํ๊ฒ ๋๋ค. ์ด๊ฒ๋ณด๋ค๋ ๋ค๋ฅธ ์ค๋ ๋์๊ฒ ์คํ์ ์๋ณดํ๋ ๊ฒ์ด ์ ์ฒด ํ๋ก๊ทธ๋จ ์ฑ๋ฅ์ด ๋์์ด ๋๋ค.
public void run(){
while(true){
if(work){
System.out.println("Thread1 ์์
๋ด์ฉ");
}else{
Thread.yield();
}
}
}
yield() ๋ฉ์๋๋ฅผ ํธ์ถํ ์ค๋ ๋๋ ์คํ ๋๊ธฐ ์ํ๋ก ๋์๊ฐ๊ณ ๋์ผํ ์ฐ์ ์์ ๋๋ ๋์ ์ฐ์ ์์๋ฅผ ๊ฐ๋ ๋ค๋ฅธ ์ค๋ ๋๊ฐ ์คํ ๊ธฐํ๋ฅผ ๊ฐ์ง ์ ์๋๋กํด์ค๋ค.
join() : ๋ค๋ฅธ ์ค๋ ๋์ ์ข
๋ฃ๋ฅผ ๊ธฐ๋ค๋ฆผ
์ค๋ ๋๋ ๋ค๋ฅธ ์ค๋ ๋์ ๋ ๋ฆฝ์ ์ผ๋ก ์คํํ๋ ๊ฒ์ด ๊ธฐ๋ณธ์ด์ง๋ง ๋ค๋ฅธ ์ค๋ ๋๊ฐ ์ข ๋ฃ๋ ๋๊น์ง ๊ธฐ๋ค๋ ธ๋ค๊ฐ ์คํํด์ผํ๋ ๊ฒฝ์ฐ๊ฐ ๋ฐ์ํ ์๋ ์๋ค. ์๋ฅผ ๋ค์ด์ ๊ณ์ฐ ์์ ์ ํ๋ ์ค๋ ๋๊ฐ ๋ชจ๋ ๊ณ์ฐ ์์ ์ ๋ง์ณค์ ๋, ๊ณ์ฐ ๊ฒฐ๊ณผ๊ฐ์ ๋ฐ์ ์ด์ฉํ๋ ๊ฒฝ์ฐ์ด๋ค.
join() ๋ฉ์๋๋ฅผ ํธ์ถํ๋ฉด ๋ค๋ฅธ ์ค๋ ๋๊ฐ ์ข ๋ฃ๋ ๋๊น์ง ์ผ์ ์ ์ง ์ํ๊ฐ ๋๊ณ ์ข ๋ฃ๋๋ฉด join()์ด ํ๋ ค์ ๋ค์ ์ฝ๋๋ฅผ ์ํํ๊ฒ ๋๋ค.
package chap12;
public class SumThread extends Thread{
private long sum;
public long getSum() {
return sum;
}
public void setSum(long sum) {
this.sum = sum;
}
@Override
public void run() {
for(int i=1;i<=100;i++)
sum+=i;
}
}
package chap12;
public class Main {
public static void main(String[] args) {
SumThread sumThread = new SumThread();
sumThread.start();
try {
// sumThread๊ฐ ์ข
๋ฃ๋ ๋๊น์ง main thread๋ฅผ ์ผ์ ์ ์ง ์ํจ๋ค.
sumThread.join();
} catch (Exception e) {
// TODO: handle exception
}
System.out.println("ํฉ : "+sumThread.getSum());
}
}
wait(), notify(), notifyAll() : ์ค๋ ๋ ๊ฐ ํ์
๊ฒฝ์ฐ์ ๋ฐ๋ผ์ ๋ ๊ฐ์ ์ค๋ ๋๋ฅผ ๊ต๋๋ก ๋ฒ๊ฐ์๊ฐ๋ฉฐ ์คํํด์ผ ํ ๊ฒฝ์ฐ๊ฐ ์๋ค. ์ ํํ ๊ต๋ ์์ ์ด ํ์ํ ๊ฒฝ์ฐ์ ์์ ์ด ์์ ์ด ๋๋๋ฉด ์๋๋ฐฉ ์ค๋ ๋๋ฅผ ์ผ์ ์ ์ง ์ํ์์ ํ์ด์ฃผ๊ณ , ์์ ์ ์ผ์์ ์ง ์ํ๋ก ๋ง๋๋ ๊ฒ์ด๋ค.
๊ณต์ ๊ฐ์ฒด ๊ฐ ํต์ฌ์ด๋ค. ๊ณต์ ๊ฐ์ฒด๋ ๋ ์ค๋ ๋๊ฐ ์์ ํ ๋ด์ฉ์ ๊ฐ๊ฐ ๋๊ธฐํ ๋ฉ์๋๋ก ๊ตฌ๋ถํด ๋๊ณ , ํ ์ค๋ ๋๊ฐ ์์ ์ ์๋ฃํ๋ฉด notify() ๋ฉ์๋๋ฅผ ํธ์ถํด ์ผ์ ์ ์ง ์ํ์ ์๋ ๋ค๋ฅธ ์ค๋ ๋๋ฅผ ์คํ ๋๊ธฐ ์ํ๋ก ๋ง๋ค๊ณ , ์์ ์ ๋ ๋ฒ ์์ ํ์ง ์๋๋ก wait() ๋ฉ์๋๋ฅผ ํธ์ถํด ์ผ์์ ์ง ์ํ๋ก ๋ง๋ ๋ค.
wait(long timeout)
์ด๋ wait(long timeout, int nanos)
๋ฅผ ์ฌ์ฉํ๋ฉด notify()๋ฅผ ํธ์ถํ์ง ์์๋ ์ง์ ๋ ์๊ฐ์ด ์ง๋๋ฉด ์ค๋ ๋๊ฐ ์๋์ ์ผ๋ก ์คํ ๋๊ธฐ ์ํ๊ฐ ๋๋ค.
notifyAll() ๋ฉ์๋๋ wait() ์ ์ํด ์ผ์ ์ ์ง๋ ๋ชจ๋ ์ค๋ ๋๋ฅผ ์คํ ๋๊ธฐ ์ํ๋ก ๋ง๋ ๋ค.
์ฃผ์ ํ ์ ์ ์ด ๋ฉ์๋๋ค์ ๋๊ธฐํ ๋ฉ์๋ ๋๋ ๋๊ธฐํ ๋ธ๋ก ๋ด์์๋ง ์ฌ์ฉํ ์ ์๋ค.
package chap12;
public class WorkObj {
public synchronized void methodA() {
System.out.println("ThreadA์ methodA ์คํ ");
// ์ผ์์ ์ง->์คํ๋๊ธฐ!
notify();
try {
//์ผ์์ ์ง์ํ๋ก ๋ง๋ฆ!
wait();
} catch (Exception e) {
// TODO: handle exception
}
}
public synchronized void methodB() {
System.out.println("ThreadB์ methodB ์คํ ");
// ์ผ์์ ์ง->์คํ๋๊ธฐ!
notify();
try {
//์ผ์์ ์ง์ํ๋ก ๋ง๋ฆ!
wait();
} catch (Exception e) {
// TODO: handle exception
}
}
}
package chap12;
public class ThreadA extends Thread{
private WorkObj workObj;
public ThreadA(WorkObj workObj) {
this.workObj = workObj;
}
@Override
public void run() {
for(int i=0;i<10;i++)
workObj.methodA();
}
}
package chap12;
public class ThreadB extends Thread{
private WorkObj workObj;
public ThreadB(WorkObj workObj) {
this.workObj = workObj;
}
@Override
public void run() {
for(int i=0;i<10;i++)
workObj.methodB();
}
}
package chap12;
public class Main {
public static void main(String[] args) {
// ๊ณต์ ๊ฐ์ฒด์์ฑ
WorkObj sharedObj = new WorkObj();
ThreadA threadA = new ThreadA(sharedObj);
ThreadB threadB = new ThreadB(sharedObj);
threadA.start();
threadB.start();
}
}
ThreadA์ methodA ์คํ
ThreadB์ methodB ์คํ
ThreadA์ methodA ์คํ
ThreadB์ methodB ์คํ
ThreadA์ methodA ์คํ
ThreadB์ methodB ์คํ
ThreadA์ methodA ์คํ
ThreadB์ methodB ์คํ
ThreadA์ methodA ์คํ
ThreadB์ methodB ์คํ
ThreadA์ methodA ์คํ
ThreadB์ methodB ์คํ
ThreadA์ methodA ์คํ
ThreadB์ methodB ์คํ
ThreadA์ methodA ์คํ
ThreadB์ methodB ์คํ
ThreadA์ methodA ์คํ
ThreadB์ methodB ์คํ
ThreadA์ methodA ์คํ
ThreadB์ methodB ์คํ
Last updated
Was this helpful?