μ€λμ μ€λ λμ μ μμ μμ± λ° μ€ν λ°©λ²μ λν΄ νμ΅νλ€. νλΆ λλ 곡λΆνλ λ΄μ©μΈλ°, κ·Έλλ μ‘°κΈ λ―μ€μλ κΈ°μ΅μ΄ λλ€. κ°λ¨ν λ¦¬λ·°ν΄ λ³΄λλ‘ νκ² λ€.

βμ€λ λλ 무μμΈκ°
μμ κ΄λ¦¬μλ₯Ό λ€μ΄κ°λ³΄λ©΄ νμ¬ μ€ν μ€μΈ μ ν리μΌμ΄μ μ¦, νλ‘μΈμ€ λͺ©λ‘μ νμΈν μ μλ€. μ΄λ, νλ‘μΈμ€ λ΄μμ μ€νλλ μμ€ μ½λμ μ€ν νλ¦μ μ€λ λλΌ νλ€.
βλ©μΈ μ€λ λλ?
μλ° μ ν리μΌμ΄μ μ μ€ννλ©΄ κ°μ₯ λ¨Όμ μ€νλλ μ€λ λλ‘ λ©μΈ μ€λ λκ° main λ©μλλ₯Ό μ€νμμΌ μ€λ€(λ§€μΌ μ¬μ©νλ public static void main~). λ©μΈ μ€λ λλ main λ©μλμ μ½λλ₯΄λ₯Ό μ²μλΆν° λκ°μ§ μμ°¨μ μΌλ‘ μ€νμν€λ©°, μ½λμ λμ λ§λκ±°λ returnλ¬Έμ λ§λλ©΄ μ€νμ μ’ λ£νλ€. μ΄λ κ² λ©μΈ μ€λ λλ§ κ°μ§λ νλ‘μΈμ€λ₯Ό μ±κΈ μ€λ λ νλ‘μΈμ€λΌ νλ©°, λ©μΈ μ€λ λμμ λ λ€λ₯Έ μ€λ λλ₯Ό μμ±ν΄μ μ€νμν¨λ€λ©΄ ν΄λΉ μ ν리μΌμ΄μ μ λ©ν° μ€λ λλ‘ λμνκ² λλ€.
βμμ μ€λ λ μμ±κ³Ό μ€ν
μλ°λ κ°μ²΄μ§ν₯ μΈμ΄λ‘ λͺ¨λ μ½λλ₯Ό ν΄λμ€ μμ μμ±ν΄μΌ νλ€. λ°λΌμ μ€λ λκ° μνν μ½λλ ν΄λμ€ λ΄λΆμ μμ±ν΄μ£Όμ΄μΌ νλ©°, run()μ΄λΌλ λ©μλλ΄μ μ€λ λκ° μ²λ¦¬ν μ½λλ₯Ό μμ±ν΄μΌ νλ€.
run() λ©μλλ Runnable μΈν°νμ΄μ€μ Thread ν΄λμ€μ μ μλμ΄μ Έ μλ€.
λ°λΌμ μ°λ¦¬λ λ€μ 2κ°μ§ λ°©λ²μΌλ‘ μμ μ€λ λλ₯Ό μμ±νκ³ μ€ν κ°λ₯νλ€.
1. Runnable μΈν°νμ΄μ€λ₯Ό ꡬνν κ°μ²΄μμ run()μ ꡬννμ¬ μ€λ λλ₯Ό μμ±νκ³ μ€ννλ λ°©λ²
2. Thread ν΄λμ€λ₯Ό μμλ°μ νμ ν΄λμ€μμ run()μ ꡬννμ¬ μ€λ λλ₯Ό μμ±νκ³ μ€ννλ λ°©λ²
λ°©λ²1)
public class RunnableThreadExample {
public static void main(String[] args) {
//Runnable ꡬν κ°μ²΄λ₯Ό μΈμλ‘ μ λ¬νλ©΄μ Thread ν΄λμ€λ₯Ό μΈμ€ν΄μ€ν νμ¬ μ€λ λ μμ±
Thread thread1 = new Thread(new ThreadTask1());
thread1.start();
}
}
class ThreadTask1 implements Runnable{
public void run(){
for(int i=0;i<100;i++){
System.out.print("#");
}
}
}
λ°©λ²2)
package codeStates.thread;
public class ThreadClassExample {
public static void main(String[] args) {
//Thread ν΄λμ€λ₯Ό μμλ°μ ν΄λμ€λ₯Ό μΈμ€ν΄μ€ννμ¬ μ€λ λλ₯Ό μμ±
ThreadTask2 thread2 = new ThreadTask2();
thread2.start();
for (int i = 0; i < 100; i++) System.out.print("@");
}
}
//Thread ν΄λμ€λ₯Ό μμλ°λ ν΄λμ€ μμ±
class ThreadTask2 extends Thread{
public void run(){
for(int i=0;i<100;i++) System.out.print("#");
}
}
λ, μ΅λͺ κ°μ²΄λ₯Ό μ¬μ©ν΄μλ μ€λ λλ₯Ό μμ±νκ³ μ€ννλ κ²μ΄ κ°λ₯νλ€.
λ°©λ²3) Runnable μ΅λͺ ꡬν κ°μ²΄λ₯Ό νμ©ν μ€λ λ μμ±νκ³ μ€ννκΈ°
package codeStates.thread;
//μ΅λͺ
κ°μ²΄λ₯Ό μ¬μ©νμ¬ μ€λ λ μμ± λ° μ€ν
public class AnonymousObjectThreadExample {
public static void main(String[] args) {
//μ΅λͺ
Runnable ꡬν κ°μ²΄λ₯Ό νμ©νμ¬ μ€λ λ μμ±
Thread thread3=new Thread(new Runnable(){
public void run(){
for(int i=0;i<100;i++) System.out.print("#");
}
});
thread3.start();
for(int i=0;i<100;i++) System.out.print("@");
}
}
λ°©λ²4) Thread μ΅λͺ νμ κ°μ²΄λ₯Ό νμ©ν μ€λ λ μμ± λ° μ€ν
package codeStates.thread;
//μ΅λͺ
κ°μ²΄λ₯Ό μ¬μ©νμ¬ μ€λ λ μμ± λ° μ€ν
public class AnonymousObjectThreadExample {
public static void main(String[] args) {
//2.Thread μ΅λͺ
κ°μ²΄λ₯Ό νμ©ν μ€λ λ μμ±
Thread thread4=new Thread(){
public void run(){
for (int i = 0; i < 100; i++) System.out.print("*");
}
};
thread4.start();
}
}
βμ€λ λ λκΈ°νλ?
λ©ν° μ€λ λ νλ‘μΈμ€μ κ²½μ°, λ μ€λ λκ° λμΌν λ°μ΄ν°λ₯Ό 곡μ νκ² λμ΄ λ¬Έμ κ° λ°μν μ μμΌλ―λ‘, λκΈ°ν μ²λ¦¬λ₯Ό ν΄μ€μΌ νλ€. μ€λ λ λκΈ°νμλ μκ³μμκ³Ό λ½μ΄λΌλ κ°λ μ΄ μλλ° μ°μ , μκ³μμμ μ€λ‘μ§ νλμ μ€λ λλ§ μ½λλ₯Ό μ€νν μ μλ μ½λ μμμ λ§νλ©°, λ½μ μκ³ μμμ ν¬ν¨νκ³ μλ κ°μ²΄μ μ κ·Όν μ μλ κΆνμ μλ―Ένλ€. μ¦, μκ³ μμμΌλ‘ μ€μ λ κ°μ²΄κ° λ€λ₯Έ μ€λ λμ μν΄ μμ μ΄ μ΄λ£¨μ΄μ§κ³ μμ§ μμ λ, μμμ μ€λ λ Aλ ν΄λΉ κ°μ²΄μ λν λ½μ νλνμ¬ μκ³ μμμ μ½λλ₯Ό μ€νν μ μλ€. μ΄λ, μ€λ λκ° Aκ° μκ³ μμ λ΄μ μ½λλ₯Ό μ€ν μ€μΌλμλ λ€λ₯Έ μ€λ λλ€μ λ½μ΄ μμΌλ―λ‘ μ΄ κ°μ²΄μ μκ³ μμ λ΄μ μ½λλ₯Ό μ€νν μ μλ€. μ΄ν, μ€λ λ Aκ° μκ³ μμ λ΄μ μ½λλ₯Ό λͺ¨λ μ€ννλ©΄ λ½μ λ°λ©. μ΄λ λΆν°λ λ€λ₯Έ μ€λ λλ€ μ€ νλκ° λ½μ νλνμ¬ μκ³ μμ λ΄μ μ½λλ₯Ό μ€ν κ°λ₯ν κ²μ΄λ€. μ¦, μ°λ¦¬λ μκ³ μμμ μ€μ νμ¬ μ€λ λ λκΈ°ν μ²λ¦¬λ₯Ό ν μ μλ€.
λκΈ°ν μμ μ½λ)
package codeStates.thread;
//μ€λ λ λκΈ°ν μμ
public class ThreadSynchronizationExample {
public static void main(String[] args) {
Runnable threadTask3 = new ThreadTask3();
Thread thread3_1 = new Thread(threadTask3);
Thread thread3_2 = new Thread(threadTask3);
thread3_1.setName("κΉμ½λ©");
thread3_2.setName("λ°μλ°");
thread3_1.start();
thread3_2.start();
}
}
class Account{
private int balance = 1000;
public int getBalance(){
return balance;
}
//λκΈ°ν μ²λ¦¬ 1) λ©μλ μ 체λ₯Ό μκ³ μμμΌλ‘ μ§μ
// public synchronized boolean withdraw(int money){
// if(balance>=money){
// try{ Thread.sleep(1000);} catch(Exception error){}
// balance -= money;
// return true;
// }
// return false;
// }
//λκΈ°ν μ²λ¦¬ 2) νΉμ ν μμμ μκ³ μμμΌλ‘ μ§μ νκΈ°
public boolean withdraw(int money){
synchronized (this){
if(balance>=money){
try{ Thread.sleep(1000);} catch(Exception error){}
balance -= money;
return true;
}
}
return false;
}
}
class ThreadTask3 implements Runnable {
Account account = new Account();
@Override
public void run() {
while(account.getBalance()>0){
//100~300μμ μΈμΆκΈμ λλ€μΌλ‘ μ ν¨.
int money = (int) (Math.random() * 3 + 1) * 100;
//withdrawλ₯Ό μ€νμν€λ λμμ μΈμΆμ±κ³΅ μ¬λΆλ₯Ό λ³μμ ν λΉ
boolean denied = !account.withdraw(money);
//μΈμΆ κ²°κ³Ό νμΈ
System.out.println(String.format("Withdraw %dμ By %s. Balancce : %d %s",
money, Thread.currentThread().getName(), account.getBalance(),denied));
}
}
}
βμ€λ λμ μνμ μ€ν μ μ΄
μμμ μ€λ λλ₯Ό μ€ννλ λ° start() λ©μλλ₯Ό μ¬μ©νμΌλ, μλ°ν λ§νλ©΄ start()λ μ€λ λλ₯Ό λ°λ‘ μ€νμν€λ λ©μλλ μλλ€. start()λ μ€λ λμ μνλ₯Ό 'μ€ν λκΈ° μν'λ‘ λ§λ€μ΄μ£Όλ λ©μλμ΄λ©°, μ΄λ€ μ€λ λκ° start()μ μν΄ μ€ν λκΈ° μνκ° λλ©΄ μ΄μ체μ κ° μ μ ν λμ μ€λ λλ₯Ό μ€νμμΌ μ€λ€.
κ·Έ λ°μ μ€λ λ μ€ν μ μ΄ λ©μλ λͺ κ°μ§λ₯Ό μμ보μ.
- static void sleep(long millis) : milliSecond λμ μ€λ λλ₯Ό μ μ λ©μΆ€. μ§μ ν μκ°λ§νΌ μ νν μ€λ λκ° μ€μ§λλ κ²μ μλκ³ , μ½κ°μ μ€μ°¨κ° μλ€. sleep()μ μν΄ μΌμμ μ§λ μ€λ λλ μΈμλ‘ μ λ¬ν μκ° λ§νΌμ μκ°μ΄ κ²½κ³Όλκ±°λ, interrupt()λ₯Ό νΈμΆν κ²½μ° μ€ν λκΈ° μνλ‘ λ³΅κ·νλ€. (interrupt()κ° νΈμΆλλ κΈ°λ³Έμ μΌλ‘ μμΈκ° λ°μνκΈ° λλ¬Έμ, sleep()μ μ¬μ©ν λμλ try..catchλ¬ΈμΌλ‘ κ°μΈμ£Όμ΄μΌ νλ€.)
- void interrupt() : μΌμ μ€μ§ μνμΈ μ€λ λλ₯Ό μ€ν λκΈ° μνλ‘ λ³΅κ·. sleep(), wait(), join()μ μν΄ μΌμ μ μ§ μνμ μλ μ€λ λλ€μ μ€ν λκΈ° μνλ‘ λ³΅κ·μν¨λ€.
- static void yield() : λ€λ₯Έ μ€λ λμκ² μμ μ μ€ν μκ°μ μ보νλ€. μλ₯Ό λ€μ΄, μ΄μ체μ μ μ€μΌμ€λ¬μ μν΄ 3μ΄λ₯Ό ν λΉλ°μ μ€λ λ Aκ° 1μ΄ λμ μμ μ μννλ€κ° yieldλ₯Ό νΈμΆνλ©΄ λ¨μ μ€ν μκ° 2μ΄λ λ€μ μ€λ λμκ² μ보λλ€.
- void join(), void join(long millis) : join()μ νΉμ μ€λ λκ° μμ νλ λμμ μμ μ μΌμ μ€μ§ μνλ‘ λ§λλ μν μ μ΄ λ©μλμ΄λ€. μΈμλ‘ μκ°μ λ°λ¦¬μ΄ λ¨μλ‘ μ λ¬ν μ μμΌλ©°, μ λ¬ν μΈμλ§νΌμ μκ°μ΄ κ²½κ³Όνκ±°λ, interrupt()κ° νΈμΆλκ±°λ, join() νΈμΆ μ μ§μ νλ λ€λ₯Έ μ€λ λκ° λͺ¨λ μμ μ λ§μΉλ©΄ λ€μ μ€ν λκΈ° μνλ‘ λ³΅κ·νλ€.
- void wait()(Objectμ μμΉ), void notify() (Objectμ μμΉ) : μ€λ λ Aμ μ€λ λ Bκ° κ³΅μ κ°μ²΄λ₯Ό λκ³ νμ νλ μν©μμ λ¨Όμ μ€λ λAκ° κ³΅μ κ°μ²΄μ μμ μ μμ μ μλ£νκ³ Bμ κ΅μ²΄νκΈ° μν΄ notify()λ₯Ό νΈμΆνλ€. notify()κ° νΈμΆλλ©΄ μ€λ λ Bκ° μ€ν λκΈ° μνκ° λλ©°, κ³§ μ€νλλ€. μ΄μ΄μ μ€λ λ Aλ wait()λ₯Ό νΈμΆνμ¬ μκΈ° μμ μ μΌμμ μ§ μνλ‘ λ§λ λ€. μ΄ν μ€λ λBκ° μμ μ μλ£νλ©΄ notify()λ₯Ό νΈμΆνμ¬ μμ μ μ€λ¨νκ³ μλ μ€λ λ Aλ₯Ό λ€μ μ€ν λκΈ° μνλ‘ λ³΅κ·μν¨ ν, wait()λ₯Ό νΈμΆνμ¬ μκΈ° μμ μ μνλ₯Ό μΌμ μ μ§ μνλ‘ μ ννλ€.
JVMκ³Ό GCλ λ€μ ν¬μ€ν μμ λ μμΈν μ¨λμλ€.

https://nothing-is-on-my-way.tistory.com/52
πJVMμ GC(Garbage Collector)
μλ°λ μ΄μ체μ μ λ 립μ μΈ μΈμ΄μ΄λ©°, μ΄λ JVMμΌλ‘ μΈν΄ κ°λ₯νλ€. πνλ‘κ·Έλλ° μΈμ΄κ° μ΄μ체μ μ λ 립μ μ΄λΌλ κ²μ λ¬΄μ¨ λ»μΌκΉ? λ¨Όμ μ΄λ ν νλ‘κ·Έλ¨μ΄ μ€νλκΈ° μν΄μλ OSλ‘ λΆν° CPU
nothing-is-on-my-way.tistory.com
'SEB TILπ' μΉ΄ν κ³ λ¦¬μ λ€λ₯Έ κΈ
TIL - μ¬κ·ν¨μ, μ¬κ·μ μ¬κ³ (0) | 2023.03.14 |
---|---|
Section1 - KPT νκ³ (1) | 2023.03.13 |
TIL - μ λν μ΄μ , λλ€, stream (0) | 2023.03.08 |
TIL - JCK(Java Collection Framework μ°μ΅λ¬Έμ ) (0) | 2023.03.07 |
TIL - Enum, Generic, μμΈμ²λ¦¬,JCK (0) | 2023.03.06 |