뚌ì Process
ì Thread
ì ì°šìŽì ì ìŽíŽíê³ ëìŽê°ìŒ í íìê° ìë€.
íë¡ìžì€(Process)
: OS ëŽìì ì€íì€ìž íë¡ê·žëš
ì°ë ë(Thread)
: íë¡ìžì€ ëŽìì ì€ì ìì
ìŽ ì€íëë íëŠì ëšì
ë°ëŒì íë¡ìžì€ë íë ìŽìì ì°ë ë륌 ê°ì§ê³ ìë€.
ìŒë°ì ìŒë¡ í íë¡ê·žëš(Process)ì íëì ì°ë ë륌 ê°ì§ê³ ìì§ë§, íë¡ê·žëš í겜ì ë°ëŒ ë ìŽìì ì€ë ë륌 ëìì ì€íí ì ìë€. ìŽë¬í ì€í ë°©ìì ë©í°ì°ë ë(multithread)ëŒê³ íë€.
ê·Œë° ì ë©í°íë¡ìžì€ íë¡ê·žëë°ìŽ ìëëŒ ë©í°ì°ë ë íë¡ê·žëë°ì í ê¹?
ë©í°íë¡ìžì€ì ë©í°ì°ë ëë ì쪜 몚ë ì¬ë¬ íëŠìŽ ëìì ì§íëë€ë ê³µíµì ì ê°ì§ê³ ìë€.
íì§ë§ ë©í°íë¡ìžì€ìì ê° íë¡ìžì€ë ë 늜ì ìŒë¡ ì€íëë©° ê°ê° ë³ê°ì ë©ëªšëŠ¬ë¥Œ ì°šì§íê³ ìë ê²ê³Œ ë¬ëŠ¬ ë©í°ì°ë ëë íë¡ìžì€ ëŽì ë©ëªšëŠ¬ë¥Œ ê³µì íŽ ì¬ì©í ì ìë€. ëí íë¡ìžì€ ê°ì ì íìë ë§ì ë¹ì©ìŽ ì몚ëêž° ë묞ì ìëì ë¹ì© ìž¡ë©Žìì ì°ë ëê° ì 늬íêž° ë묞ìŽë€.
javaììë ì°ë ë륌 2ê°ì§ ë°©ììŒë¡ 구íí ì ìë€.
Thread íŽëì€
륌 ììRunnable ìží°íìŽì€
륌 구íThread íŽëì€ë¥Œ ììë°ì ì°ë ë륌 구ííë©Ž, Thread íŽëì€ ëŽì run ë©ìë륌 ì¬ì ì(Override) íë©Ž ëë€.
public class ThreadByThread extends Thread {
@Override
public void run() {
System.out.println("Run Thread By Thread");
}
}
public class Main {
public static void main(String[] args) {
ThreadByThread thread =new ThreadByThread();
thread.start();
}
}
Thread íŽëì€ë¥Œ ììë°ì ê°ì²Žë¥Œ ìì±íì¬ start ë©ìë륌 ížì¶íšìŒë¡ìš ì°ë ë륌 ìì±í ì ìë€.
Runnable ìží°íìŽì€ë¥Œ 구ííì¬ ì°ë ë륌 구ííë©Ž, run ë©ìë ìì ì°ë ëê° í ìœë륌 ìì±íŽì£Œë©Ž ëë€.
public class ThreadByRunnable implements Runnable {
@Override
public void run() {
System.out.println("Run Thread By Runnable");
}
}
public class Main {
public static void main(String[] args) {
Thread thread = new Thread(new ThreadByRunnable());
thread.start();
}
}
ì¬êž°ì Runnable ê°ì²Žë Threadê°ì²Žë¥Œ ìì±íì¬ Thread ìì±ìì íëŒë¯ží°ë¡ ëêž°ìŽ Thread íì ìŒë¡ ìì± í start ë©ìë륌 ížì¶íšìŒë¡ìš ì°ë ë륌 ìì±í ì ìë€.
ì°ë ë ì€ìŒì€ë§
: ì°ë ëì ê°ìê° ìœìŽ(CPU)ì ìë³Žë€ ë§ì 겜ì°, ì°ë ë륌 ìŽë€ ììì ìíŽ concurrentíê² ì€íí ê²ìžê°ë¥Œ ì íë ìì
ì€í ìí
: ì€í ëêž° ìíì ìë ì°ë ë ì€ìì ì°ë ë ì€ìŒì€ë§ìŒë¡ ì íë ì°ë ëê° CPU륌 ì ì íê³ run()
ë©ìë륌 ì€íí ìí
ì°ë ë ìí륌 íìží ì ìëë¡ íŽì£Œë getState()
ë©ìëë ì°ë ë ìíì ë°ë¥ž Thread.State
ìŽê±° ìì륌 늬íŽíë€.
ìí | ìŽê±° ìì | ì€ëª |
---|---|---|
ìì± | NEW | ì€ë ë ê°ì²Žê° ìì±ë ìí. ìì§ start() ížì¶ ì |
ëêž° | RUNNABLE | ì€íë ì€ë¹(ì€ìŒì€ë¬ì ìíŽ ì í ë°êž° ì )륌 ë§ì¹ ìí. start() ížì¶ ëš |
ì ì§ | WAITING | ë€ë¥ž ì€ë ëë¡ë¶í° ì€ë ìŽë²€ížë¥Œ ëêž°íë ìí |
TIMED_WAITING | 죌ìŽì§ ìê° ëì ëêž°íë ìí | |
BLOCKED | ì¬ì©íê³ ì íë ê°ì²Žì lockìŽ í늎 ëê¹ì§ ëêž°íë ìí | |
ì¢ ë£ | TERNINATED | ì€íìŽ ë€ ëë ìí |
NEW
ë¡ ì°ë ë ê°ì²Žë¥Œ ìì±íê³ , start()
ë©ìë륌 ížì¶íë©Ž 곧ë°ë¡ ì°ë ëê° ì€íëë ê²ì²ëŒ 볎ìŽì§ë§ ì¬ì€ì ì€ë¹ê° ìë£ë ëêž° ìíìŽë€.
ì€í ëêž° ìíì ìë ì°ë ë ì€ìì ì°ë ë ì€ìŒì€ë§ìŒë¡ ì íë ì°ë ëë§ìŽ ì€í ìíê° ëê³ , ì€í ìíì ì°ë ëë run()
ë©ìë륌 몚ë ì€ííêž° ì ì ì°ë ë ì€ìŒì€ë§ì ìíŽ ë€ì ì€í ëêž° ìíë¡ ëìê° ì ìë€(interrupt).
ê·žëŠ¬ê³ ì€í ëêž° ìíì ìë ë€ë¥ž ì°ë ëê° ì í(scheduler dispatch)ëë ë°©ììŒë¡ ì°ë ë ì€ìŒì€ë§ìŽ ìŽë£šìŽ ì§ë€.
ìë íë ì°ë ëì ìí륌 ì¡°ìí ì ìë ë©ìëìŽë€.
ë©ìë | ì€ëª |
---|---|
static void yield() | íì¬ ì°ë ëê° íë¡ìžìì íì¬ ì¬ì©ì ì볎(yield) í ìì¬ê° ìë€ë ì€ìŒì€ë¬ì ëí íížìŽë€. |
static void sleep(long millis) | íì¬ ì€íì€ìž ì°ë ëê° ì§ì ë ë°ëŠ¬ ìŽ ëì ìŒìì ìŒë¡ ì€í ì€ì§ ëëë¡ íë€. ìŠ, TIMED_WAITING ìíë¡ ë§ë ë€. |
void join(long millis) | ìŽ ì°ë ëê° ìì ìŽ ìë£ ë ëê¹ì§ êž°ë€ëŠ°ë€. |
void interrupt() | ìŽ ì°ë ëì interrupted ìí륌 trueë¡ ë³ê²œíë€. |
ì°ë ëì ì°ì ìì륌 ë¶ì¬íšìŒë¡ìš íŽë¹ ì°ë ëê° ëšŒì ë ë íë¥ ì ëì¬ì€ë€.
íì§ë§, ì°ì ììê° ëë€ê³ íŽì 묎조걎 뚌ì ëëë ê²ì ìëë€.
javaìì ì°ë ëì ì°ì ìì륌 ì€ì íë ë°©ë²ì setPriority(int weight)
ë©ìë륌 íµíŽ ì€ì í ì ìë€.
weight
íëŒë¯ží°ë ì«ìê° íŽìë¡ ì°ì ììê° ëìê²ìŽë©°, ì€ì ë²ìë 1ë¶í° 10ê¹ì§ ì°ì ìì륌 ì€ì í ì ìë€.
ëíŽíž weight
ë ì€ê°ê°ìž 5ê° ì€ì ëë€.
Main ì°ë ëë 몚ë ìë° ì í늬ìŒìŽì ì ììì ìŽë€.
Main ì°ë ëë¡ íë¡ê·žëšìŽ ììëìŽ ì€íì ëê³ , ë©í° ì°ë ëë ì±êž ì°ë ëìž Main ì°ë ëììë¶í° íìëìŽ ìì±ë ì°ë ëëŒê³ í ì ìë€.
ì°žê³ ë¡, ë©í° ì°ë ë ìŽí늬ìŒìŽì ììë Main ì€ë ëê° ì¢ ë£ëëëŒë ìì ì€ë ëê° ì¢ ë£ëì§ ììŒë©Ž ìŽí늬ìŒìŽì ìŽ ì¢ ë£ëì§ ìëë€.
public static void main(String[] args) { // ë©ìž ì°ë ë
Thread thread = new Thread(new ThreadByRunnable()); // ë©í° ì°ë ë ìì±
thread.start();
}
ë©í°ì°ë ë íë¡ê·žëë°ìì ì¬ë¬ ì°ë ëê° í íë¡ìžì€ëŽ ììì ê³µì íë¯ë¡ í ì°ë ëê° ì§íì€ìž ìì ì ë€ë¥ž ì°ë ë 쪜ìì ì¬ì©, ë³ê²œíë ìŒìŽ ë°ìí ì ìë€.
ìŽë¬í 묞ì ì ì íŽê²° íêž°ìíŽ íëì ì°ë ëë§ ìì ëŽì ìœë륌 ìííëë¡ íë ì°ë ë ëêž°í륌íë€.
javaìì 2ê°ì§ ë°©ììŒë¡ ë©í°ì°ë ë íë¡ê·žëë° ëêž°í í ì ìë€.
synchronized
í€ìë ì¬ì©java.lang.Object
íŽëì€ì wait()
, notify()
, notifyAll()
ë©ìë ì¬ì©synchronized
í€ìë ì¬ì©synchronized
í€ìëë¡ ì€í ëžë¡ìŽë, ë©ìë륌 ìê³ êµ¬ììŒë¡ ë§ë€ìŽ ëêž°í ìí¬ ì ìë€.
ëêž°í ëžë¡
synchronized(ì°ë ë ê°ì²Ž){
// ëêž°í ìí¬ ìœë
}
ëêž°í ë©ìë
public static synchronized void syncMethod(){
// ëêž°í ìí¬ ìœë
}
íŽë¹ ëêž°í ëžë¡ìŽë, ë©ìëë íëì ì°ë ëë§ìŽ ì§ì ë ì ìë€.
ìë íì ë©ìëë€ì ìê³ êµ¬ìììë§ ì¬ì© ê°ë¥íë€.
ë©ìë | ì€ëª |
---|---|
wait() | ë€ë¥ž ì€ë ëê° notify() ë¡ ë¶ë¬ì€ ëê¹ì§ ëêž°íë€. |
notify() | 묎ììë¡ ëêž° ì€ìž ì€ë ë륌 깚ì RUNNABLE ìíë¡ ë³ê²œ, 2ê° ìŽìì ì€ë ëê° ëêž° ì€ìŽëŒë ì€ì§ í ê°ì ì€ë ëë§ ê¹šì RUNNABLE ìíë¡ ë³ê²œíë€. |
notifyAll() | ëêž° ì€ìž 몚ë ì€ë ë륌 깚ì°ê³ 몚ë RUNNABLE ìíë¡ ë³ê²œíë€. |
ë°ëëœì, ë ê° ìŽìì ì°ë ëë€ìŽ ê°ì ììì ì ì í ìíìì ìë¡ ë€ë¥ž ì°ë ëì ììì ì구íë©° 몚ë 묎íì ëêž°ì€ìž ìí륌 ë§íë€.
ìŠ, ì°ë ë1ìŽ ìì1ì ì ì íìê³ , ì°ë ë2ê° ìì2륌 ì ì í ìíìì ì°ë ë1ìŽ ìì2륌 ìì²íëë° ì°ë ë2ë ìì 1ì ìì²íì¬ ìë¡ ììì ì ì í ì± ìì²ë§ íë©° ì볎íì§ ìê³ ë²í°ë ìí©ìŽë€.
ê·žë êž° ë묞ì yield()
륌 ì¬ì©íì¬ ì볎륌 íêž°ë íë€.
enum ìŽë êŽë šìŽ ìë "ìì"ì ì§í©ì ì ìíë íì ìŒë¡ íŽëì€ì í¹ìí íììŽë€.
ìë°5ë¶í° enum íì ìŽ ëì ëìê³ , ë³ì, ë©ìë, ìì±ì륌 ì¶ê°íì¬ ì¬ì©í ì ìë€.
enum íì ì ì¬ë¬ í¹ì±ë€ìŽ ì¡Žì¬íë€.
java.lang.Enum
íŽëì€(ì¶ì íŽëì€)륌 ììí ìì í íŽëì€ìŽë¯ë¡ íëì ë©ìë륌 ê°ì§ ì ììŒë©°, ê·žë¬ë¯ë¡ ë€ë¥ž íŽëì€ë¥Œ ììë°ì ì ìë€.public static final
íì
ìŒë¡ ê³µê°ëë©° ììì ëìŒíê² ëª
ì¹ì ì ë¶ ë묞ìë¡ ì ìíë€.private
ë¡ ëì ìŒë¡ ê°ì ë³ê²œíì¬ ìì±íë©Ž ìëë€.equals()
ë©ìëê° ìë ==
ë¡ ë¹êµê° ê°ë¥íë€.public enum CHICEKN {
[public static final] BBQ("BBQì¹íš"), //CHICEKN.BBQë¡ ì ê·Œ
[public static final] PURADAK("ížë€ëœì¹íš"), // ;ê° ìë ,
[public static final] GOOBNE("굜ë€ì¹íš"); // ëŽë¶ì ìŒë¡ newë¡ ìì±í ê²ê³Œ ê°ë€.
private final String name; // íë륌 ê°ì§ ì ìì
[private] CHICEKN(String name) { // private ìëµ
this.name = name;
}
public String getName() { // ë©ìë륌 ê°ì§ ì ìì
return name;
}
}
enum íì ì java.lang.Enum íŽëì€ë¥Œ ììíë¯ë¡ íŽë¹ íŽëì€ì ë©ìë륌 ì¬ì©í ì ìëë°,
ëíì ìž ë©ìëë¡ë values()
, valueOf()
, ordinal()
ìŽ ìë€.
ë©ìë | ì€ëª |
---|---|
values() | 몚ë enum ììë€ì enum íì ë°°ìŽë¡ ë°í |
valueOf() | í¹ì 묞ììŽìŽ enum íì ìŒë¡ ì¡Žì¬íë©Ž ë°í(ì¡Žì¬íì§ ììŒë©Ž exception ë°ì) |
ordinal() | íŽë¹ enum ììì index륌 ë°í |
ìŽëŠ ê·žëë¡ Setì êž°ë°ìŒë¡ ìœê³ ë¹ ë¥Žê² enum íì ììë€ì ë€ë£°ì ìë êž°ë¥ì ì ê³µíë€.
enumì ì±êžíŽ íšíŽì ëšìŒ ê°ì²Žìì ë³Žì¥ íšìŒë¡ íŽì±ìì ì íìë¡ íì§ ìêž° ë묞ì EnumSetì enumì ìì ê°¯ìê° 64ê°ë¥Œ ëì§ ìëë€ë©Ž, ëŽë¶ì ìŒë¡ long ë°ìŽí°íì 64ë¹íž íë륌 ìŽì©íì¬ ì¢ì ì±ë¥ì 볎ì¬ì€ë€.
ëíì ìž EnumSetì ë©ìëë¡ë .allOf(enum.class)
, EnumSet.of(enum1, enum2...)
, EnumSet.complementOf(enum of EnumSet)
, EnumSet.range(enum1, enum4)
ê° ìë€.
ë©ìë | ì€ëª |
---|---|
.allOf(enum.class) | enum íì ì 몚ë ììë€ì ê°ì žì€êž° |
EnumSet.of(enum1, enum2...) | í¹ì enumììë€ì ê°ì žì€êž° |
EnumSet.complementOf(enum of EnumSet) | í¹ì í enumìì륌 ì ìžíê³ ê°ì žì€êž° |
EnumSet.range(enum1, enum4) | ë²ìë¡ ììë€ ê°ì žì€êž° |