[JAVA] Thread

ho'sΒ·2022λ…„ 5μ›” 25일
0

μœ„ 글은 κΉ€μ„±λ°•μ„ μƒλ‹˜μ˜ μžλ°” κ°•μ˜λ₯Ό λ°”νƒ•μœΌλ‘œ μ“°μ—¬μ‘ŒμŠ΅λ‹ˆλ‹€.
더 μžμ„Έν•œ λ‚΄μš©μ€ μ•„λž˜ 링크λ₯Ό 톡해 μ•Œμ•„λ³΄μ‹€ 수 μžˆμŠ΅λ‹ˆλ‹€.

λΆ€λΆ€κ°œλ°œλ‹¨ 유투브


πŸŽͺThread

πŸ‘”μ„±λŠ₯이 쒋은 ν”„λ‘œκ·Έλž¨μ€ μ–΄λ–»κ²Œ λ§Œλ“€κΉŒ?

  • BλŠ” 병렬화 κ°€λŠ₯ν•˜μ§€ μ•Šμ€ 뢀뢄이닀.
  • 1-BλŠ” 병렬화 κ°€λŠ₯ν•œ 뢀뢄이닀.

1-B뢀뢄을 λ³‘λ ¬ν™”ν•΄μ„œ μ‹€ν–‰μ‹œν‚¨λ‹€λ©΄, ν”„λ‘œκ·Έλž¨μ˜ μ„±λŠ₯을 ν–₯상 μ‹œν‚¬ 수 μžˆλ‹€.

πŸ€ 병렬화 ν•  λ•Œ κ³ λ €ν•΄μ•Ό ν•  것듀

  • λ©”λͺ¨λ¦¬μ˜ 속도
  • CPU μΊμ‹œ λ©”λͺ¨λ¦¬
  • λ””μŠ€ν¬
  • λ„€νŠΈμ›Œν¬
  • 컨λ„₯μ…˜
  • 순차적 싀행이 병렬싀행보닀 λΉ λ₯Έ κ²½μš°λ„ μžˆλ‹€. λ™μ‹œ 싀행에 λ”°λ₯΄λŠ” μ˜€λ²„ν—€λ“œκ°€ μ—†κ³ , 단일 CPU μ•Œκ³ λ¦¬μ¦˜μ€ ν•˜λ“œμ›¨μ–΄ μž‘μ—…μ— 더 μΉœν™”μ μΌ 수 있기 λ•Œλ¬Έμ΄λ‹€.

μ•”λ‹¬μ˜ 법칙(Amdahl's Law)

μ•”λ‹¬μ˜ 법칙( Amdahl's Law )은 μ•”λ‹¬μ˜ μ €μ£Όλ‘œλ„ 뢈리며, 컴퓨터 μ‹œμŠ€ν…œμ˜ 일뢀λ₯Ό κ°œμ„ ν•  λ•Œ μ „μ²΄μ μœΌλ‘œ μ–Όλ§ˆλ§ŒνΌμ˜ μ΅œλŒ€ μ„±λŠ₯ ν–₯상이 μžˆλŠ”μ§€ κ³„μ‚°ν•˜λŠ”λ° μ‚¬μš©λœλ‹€. 진 μ•”λ‹¬μ˜ μ΄λ¦„μ—μ„œ λ”°μ™”λ‹€. 이둠(theory)만 λ§Žμ€ 컴퓨터과학 λΆ„μ•Όμ—μ„œ λͺ‡ μ•ˆλ˜λŠ” 법칙(Law)이닀.

πŸ€ 병렬 vs 병행

  • 병행(Concurrent)은 λ©€ν‹°μŠ€λ ˆλ“œ ν”„λ‘œκ·Έλž˜λ°μ„ μ˜λ―Έν•œλ‹€.
  • 병렬(Parallel)은 λ©€ν‹°μ½”μ–΄ ν”„λ‘œκ·Έλž˜λ°μ„ μ˜λ―Έν•œλ‹€.
  • μš°λ¦¬κ°€ μ‚΄νŽ΄λ³Ό 것은 병행 ν”„λ‘œκ·Έλž˜λ°(λ™μ‹œμ„± ν”„λ‘œκ·Έλž˜λ°, λ©€ν‹°μŠ€λ ˆλ“œ ν”„λ‘œκ·Έλž˜λ°)

πŸ€ μœˆλ„μš° μž‘μ—…κ΄€λ¦¬μžμ—μ„œ ν”„λ‘œμ„ΈμŠ€ 보기

  • 각각의 ν”„λ‘œμ„ΈμŠ€λ“€μ€ μžμ‹ λ§Œμ˜ λ©”λͺ¨λ¦¬λ“€μ„ ν™•λ³΄ν•œ μƒνƒœλ‘œ μ‹€ν–‰λ˜κ³  μžˆλ‹€.

πŸ€ Process

  • 각각의 ν”„λ‘œμ„ΈμŠ€λŠ” λ©”λͺ¨λ¦¬ κ³΅κ°„μ—μ„œ λ…λ¦½μ μœΌλ‘œ μ‘΄μž¬ν•œλ‹€.
  • 각각의 ν”„λ‘œμ„ΈμŠ€λŠ” λ‹€μŒ νŽ˜μ΄μ§€ κ·Έλ¦Όκ³Ό 같이 μžμ‹ λ§Œμ˜ λ©”λͺ¨λ¦¬ ꡬ쑰λ₯Ό κ°–λŠ”λ‹€.
  • ν”„λ‘œμ„ΈμŠ€ A,B,Cκ°€ μžˆμ„ 경우 각각 ν”„λ‘œμ„ΈμŠ€λŠ” λͺ¨λ‘ 같은 ꡬ쑰의 λ©”λͺ¨λ¦¬ 곡간을 가진닀.
  • 독립적인 만큼 λ‹€λ₯Έ ν”„λ‘œμ„ΈμŠ€μ˜ λ©”λͺ¨λ¦¬ 곡간에 μ ‘κ·Όν•  수 μžˆλ‹€.

각각의 ν”„λ‘œμ„ΈμŠ€λŠ” νž™,μŠ€νƒ,데이터,BSS,Textλ₯Ό κ°–κ³  μžˆλ‹€.


ν”„λ‘œμ„ΈμŠ€λŠ” 독립적이기 λ•Œλ¬Έμ— λ‹€λ₯Έ ν”„λ‘œμ„ΈμŠ€μ˜ λ©”λͺ¨λ¦¬μ— μ ‘κ·Όν•  수 μ—†λ‹€.

πŸ€ λ‹€λ₯Έ Process에 μ ‘κ·Όν•˜λŠ” 방법

IPC

  • ν”„λ‘œμ„ΈμŠ€ Aμ—μ„œ ν”„λ‘œμ„ΈμŠ€ Bλ₯Ό 직접 μ ‘κ·Όν•  수 μ—†κΈ° λ•Œλ¬Έμ— ν”„λ‘œμ„ΈμŠ€ κ°„μ˜ 톡신을 ν•˜λŠ” νŠΉλ³„ν•œ 방식이 ν•„μš”ν•˜λ‹€. λ©”μΌμŠ¬λ‘(mailslot), νŒŒμ΄ν”„(pipe)등이 λ°”λ‘œ ν”„λ‘œμ„ΈμŠ€ κ°„μ˜ 톡신 즉, IPC의 예 듀이닀.

  • ν”„λ‘œμ„ΈμŠ€λŠ” 독립적인 λ©”λͺ¨λ¦¬ 곡간을 μ§€λ‹ˆκΈ° λ•Œλ¬Έμ— IPλ₯Ό ν†΅ν•˜μ§€ μ•Šκ³  톡신 ν•  수 μ—†λ‹€.

  • ν”„λ‘œμ„ΈμŠ€κ°€ μ—¬λŸΏμ΄ λ³‘λ ¬μ μœΌλ‘œ μ‹€ν–‰λ˜κΈ° μœ„ν•΄μ„œλŠ” ν•„μ—°μ μœΌλ‘œ μ»¨ν…μŠ€νŠΈ μŠ€μœ„μΉ­μ΄ λ°œμƒν•  수 밖에 μ—†λ‹€. 이것을 ν•΄κ²°ν•  수 μžˆλŠ” 것이 Thread이닀.

즉, ν”„λ‘œμ„ΈμŠ€κ°„μ— ν†΅μ‹ ν•˜κΈ° μœ„ν•΄ IPCκ°€ μ‚¬μš©λœλ‹€λŠ” 것을 μ•Œ 수 μžˆλ‹€.

πŸ€ Thread

  • μŠ€λ ˆλ“œλŠ” ν•˜λ‚˜μ˜ ν”„λ‘œκ·Έλž¨ 내에 μ‘΄μž¬ν•˜λŠ” μ—¬λŸ¬ 개의 μ‹€ν–‰ 흐름을 μœ„ν•œ λͺ¨λΈμ΄λ‹€.
  • μš°λ¦¬κ°€ μƒκ°ν•˜λŠ” ν”„λ‘œκ·Έλž¨μ΄ μ‹€ν–‰λ˜κΈ° μœ„ν•΄μ„œ ν•˜λ‚˜μ˜ μ‹€ν–‰νλ¦„μœΌλ‘œ μ²˜λ¦¬ν•  μˆ˜λ„ μžˆμ§€λ§Œ, λ‹€μˆ˜μ˜ μ‹€ν–‰νλ¦„μœΌλ‘œ μ²˜λ¦¬ν•  μˆ˜λ„ μžˆλ‹€.
  • 뒀에 λ‚˜μ˜€λŠ” κ·Έλ¦Όκ³Ό 같이 μŠ€λ ˆλ“œλŠ” ν”„λ‘œμ„ΈμŠ€μ™€ λ³„κ°œκ°€ μ•„λ‹Œ ν”„λ‘œμ„ΈμŠ€λ₯Ό κ΅¬μ„±ν•˜κ³  μ‹€ν–‰ν•˜λŠ” 흐름이닀.

  • ν•˜λ‚˜μ˜ ν”„λ‘œμ„ΈμŠ€κ°€ 가지고 μžˆλŠ” λ©”λͺ¨λ¦¬λ₯Ό μ—¬λŸ¬κ°œμ˜ μŠ€λ ˆλ“œκ°€ κ³΅μœ ν•œλ‹€λŠ” λœ»μ΄λ‹€.

  • ν”„λ‘œμ„ΈμŠ€μ™€ ν”„λ‘œμ„ΈμŠ€μ˜ μ „ν™˜λ³΄λ‹€ ν”„λ‘œμ„ΈμŠ€μ™€ μŠ€λ ˆλ“œμ˜ μ „ν™˜μ˜ λΉ„μš©μ΄ 훨씬 적닀.

πŸ€ Thread 와 Process의 비ꡐ

  • ThreadλŠ” Process μ•ˆμ— μ‘΄μž¬ν•˜λŠ” 싀행흐름이닀.

  • ThreadλŠ” Process의 heap,static, code μ˜μ—­λ“±μ„ κ³΅μœ ν•œλ‹€.

  • ThreadλŠ” stackμ˜μ—­μ„ μ œμ™Έν•œ λ©”λͺ¨λ¦¬ μ˜μ—­μ€ κ³΅μœ ν•œλ‹€.

  • Threadκ°€ codeμ˜μ—­μ„ κ³΅μœ ν•˜κΈ° λ•Œλ¬Έμ— ν”„λ‘œμ„ΈμŠ€ λ‚΄λΆ€μ˜ μŠ€λ ˆλ“œλ“€μ€ ν”„λ‘œμ„ΈμŠ€κ°€ 가지고 μžˆλŠ” ν•¨μˆ˜λ₯Ό μžμ—°μŠ€λŸ½κ²Œ λͺ¨λ‘ ν˜ΈμΆœν•  수 μžˆλ‹€.

  • ThreadλŠ” IPC없이도 Thread κ°„μ˜ 톡신이 κ°€λŠ₯ν•˜λ‹€. A,B μŠ€λ ˆλ“œλŠ” ν†΅μ‹ ν•˜κΈ° μœ„ν•΄ heapμ˜μ—­μ— λ©”λͺ¨λ¦¬ 곡간을 ν• λ‹Ήν•˜κ³ , 두 Threadκ°€ 자유둭게 μ ‘κ·Όν•  수 μžˆλ‹€.

  • ν”„λ‘œμ„ΈμŠ€μ²˜λŸΌ μŠ€μΌ€μ₯΄λ§μ˜ λŒ€μƒμ΄λ‹€. 이 κ³Όμ •μ—μ„œ μ»¨ν…μŠ€νŠΈ μŠ€μœ„μΉ­μ΄ λ°œμƒν•œλ‹€. ν•˜μ§€λ§Œ μŠ€λ ˆλ“œλŠ” κ³΅μœ ν•˜κ³  μžˆλŠ” λ©”λͺ¨λ¦¬ μ˜μ—­ 덕뢄에 μ»¨ν…μŠ€νŠΈ μŠ€μœ„μΉ­ λ•Œλ¬Έμ— λ°œμƒν•˜λŠ” μ˜€λ²„ν—€λ“œκ°€ ν”„λ‘œμ„ΈμŠ€μ— λΉ„ν•΄ μž‘λ‹€.

  • λ™μž‘μ€‘μΈ ν”„λ‘œμ„ΈμŠ€κ°€ λ°”λ€” λ•Œ ν”„λ‘œμ„ΈμŠ€λŠ” ν˜„μž¬ μžμ‹ μ˜ μƒνƒœ(contex정보)λ₯Ό 일단 λ³΄μ‘΄ν•œ ν›„, μƒˆλ‘­κ²Œ λ™μž‘κ°œμ‹œν•˜λŠ” ν”„λ‘œμ„ΈμŠ€λŠ” 이전에 보쑴해 λ‘μ—ˆλ˜ μžμ‹ μ˜ μ»¨ν…μŠ€νŠΈ 정보λ₯Ό λ‹€μ‹œ λ³΅κ΅¬ν•œλ‹€. 이와 같은 ν˜„μƒμ„ μ»¨ν…μŠ€νŠΈ μŠ€μœ„μΉ­μ΄λΌ λ§ν•œλ‹€.

  • μŠ€λ ˆλ“œμ˜ μ»¨ν…μŠ€νŠΈ μ •λ³΄λŠ” ν”„λ‘œμ„ΈμŠ€λ³΄λ‹€ 적기 λ•Œλ¬Έμ— μŠ€λ ˆλ“œμ˜ μ»¨ν…μŠ€νŠΈ μŠ€μœ„μΉ­μ€ κ°€λ³κ²Œ ν–‰ν•΄μ§€λŠ” 것이 보톡이닀.

  • ν•˜μ§€λ§Œ μ‹€μ œλ‘œ μŠ€λ ˆλ“œμ™€ ν”„λ‘œμ„ΈμŠ€ κ΄€κ³„λŠ” JVMκ΅¬ν˜„μ— 크게 μ˜μ‘΄ν•œλ‹€.

ν”Œλž«νΌμ΄ 같아도 JVM의 κ΅¬ν˜„λ°©λ²•μ— 따라 ν”„λ‘œμ„ΈμŠ€μ™€ μŠ€λ ˆλ“œμ˜ κ΄€κ³„λŠ” λ‹¬λΌμ§ˆ 수 μžˆλ‹€.

πŸ€ λ©€ν‹°μ“°λ ˆλ“œ(Multithread) 싀행방식

πŸ“• MainThread

μ§€κΈˆκΉŒμ§€ μ½”λ“œλ“€μ€ λ©”μΈλ©”μ†Œλ“œμ—μ„œ 싀행이 λ˜μ–΄μ„œ, 흐름이 ν•˜λ‚˜ 밖에 μ—†μ—ˆλ‹€.

πŸ“˜ MultiThread

λ©”μΈμŠ€λ ˆλ“œ μ•ˆμ—μ„œ μƒˆλ‘œμš΄ μŠ€λ ˆλ“€μ„ μ‹€ν–‰ μ‹œν‚¬ 수 μžˆλ‹€.
이 말은 λ™μ‹œμ— μ—¬λŸ¬κ°œμ˜ μž‘μ—…μ„ μˆ˜ν–‰ ν•  수 μžˆλ‹€λŠ” 것을 μ˜λ―Έν•œλ‹€.

🩳Thread클래슀 λ§Œλ“œλŠ” 방법

πŸ₯Ž Thread 클래슀λ₯Ό 상속받아 μ“°λ ˆλ“œ μž‘μ„±ν•˜κΈ°

-run() λ©”μ†Œλ“œλ₯Ό 상속받고 μžˆλŠ” ν΄λž˜μŠ€μ—μ„œ μ˜€λ²„λΌμ΄λ”© ν•΄μ£Όμ–΄μ•Ό ν•œλ‹€.

class Xxx extends Thread{
	public void run(){
    	// λ™μ‹œμ— 싀행될 μ½”λ“œ μž‘μ„±
    }
} 

run() λ©”μ†Œλ“œ μ˜€λ²„λΌμ΄λ”© ν•˜κΈ°

Xxx x = new Xxx();
x.start();

Threadλ₯Ό 상속받은 클래슀의 객체λ₯Ό λ§Œλ“  ν›„, x.start()λ₯Ό μ΄μš©ν•΄ μ‹€ν–‰μ‹œν‚¨λ‹€.

πŸ₯Ž Thread 예제 μ½”λ“œ

πŸ’‘ 1μ΄ˆλ§ˆλ‹€ *λ₯Ό 10번 좜λ ₯ν•˜λŠ” ν”„λ‘œκ·Έλž¨μ„ μž‘μ„±ν•˜μ‹œμ˜€.

package totojava.thread;

public class MyThreadExam {
    public static void main(String[] args) {
        /*
         1μ΄ˆλ§ˆλ‹€ *λ₯Ό 좜λ ₯ν•΄μ„œ 10번 좜λ ₯ν•˜λŠ” ν”„λ‘œκ·Έλž¨μ„ μž‘μ„±ν•˜μ‹œμ˜€.
         */
        for(int i=0;i<10;i++) {
            System.out.print("*");
            try {
                Thread.sleep(1000);
            }catch(InterruptedException e){
                e.printStackTrace();
            }
        } // for

    }
}
  • sleep은 μ˜ˆμ™Έλ₯Ό λ°œμƒν•˜κΈ° λ•Œλ¬Έμ— μ˜ˆμ™Έ 처리λ₯Ό ν•΄μ€€λ‹€.

πŸ’‘ 1μ΄ˆλ§ˆλ‹€ *, +λ₯Ό 10번 좜λ ₯ν•˜λŠ” ν”„λ‘œκ·Έλž¨μ„ μž‘μ„±ν•˜μ‹œμ˜€.


package totojava.thread;

public class MyThreadExam {
    public static void main(String[] args) {
        /*
         1μ΄ˆλ§ˆλ‹€ *λ₯Ό 좜λ ₯ν•΄μ„œ 10번 좜λ ₯ν•˜λŠ” ν”„λ‘œκ·Έλž¨μ„ μž‘μ„±ν•˜μ‹œμ˜€.
         */
        for(int i=0;i<10;i++) {
            System.out.print("*");
            try {
                Thread.sleep(1000);
            }catch(InterruptedException e){
                e.printStackTrace();
            }
        } // for

        for(int i=0;i<10;i++) {
            System.out.print("+");
            try {
                Thread.sleep(1000);
            }catch(InterruptedException e){
                e.printStackTrace();
            }
        } // for

    }
}

μ‹€ν–‰κ²°κ³Ό

πŸ’‘ 메인 λ©”μ†Œλ“œκ°€ μ‹€ν–‰λ˜λ©΄ λ©”μΈμŠ€λ ˆλ“œκ°€ ν•˜λ‚˜ μƒμ„±λœλ‹€. κ·Έ 이름을 μ•Œμ•„λ³΄μž!

πŸ’‘ Thread μ‹€ν–‰μ‹œν‚€λŠ” 방법

  1. Thread클래슀λ₯Ό μƒμ†λ°›λŠ”λ‹€.
  2. run() λ©”μ†Œλ“œλ₯Ό μ˜€λ²„λΌμ΄λ”©

ν”„λ‘œκ·Έλž¨ μ’…λ£ŒλŠ” μ–Έμ œ λ˜λŠ”κ°€?
βŒ› Threadλ₯Ό 배우기 μ „
λ©”μΈλ©”μ†Œλ“œκ°€ λλ‚˜λ©΄ ν”„λ‘œκ·Έλž¨μ΄ μ’…λ£Œλ˜λŠ” 것.

⏳ Threadλ₯Ό 배운 ν›„
λͺ¨λ“  μŠ€λ ˆλ“œκ°€ μ’…λ£Œλ  λ•Œ ν”„λ‘œκ·Έλž¨μ΄ μ’…λ£Œ λœλ‹€.

πŸ’‘ +,*λ₯Ό μŠ€λ ˆλ“œλ₯Ό μ΄μš©ν•΄ 좜λ ₯ν•˜λŠ” μ½”λ“œ

package totojava.thread;

public class MyThread extends Thread {

    private String str;

    public MyThread(String str){
        this.str = str;
    }


    @Override
    public void run() {
        for(int i=0;i<10;i++) {
            System.out.print(str);
            try {
                Thread.sleep(1000);
            }catch(InterruptedException e){
                e.printStackTrace();
            }
        } // for

    }
}
package totojava.thread;

public class MyThreadExam {
    public static void main(String[] args) {

        String name = Thread.currentThread().getName();
        System.out.println("thread name : " + name);
        System.out.println("start!");
        /*
         1μ΄ˆλ§ˆλ‹€ *λ₯Ό 좜λ ₯ν•΄μ„œ 10번 좜λ ₯ν•˜λŠ” ν”„λ‘œκ·Έλž¨μ„ μž‘μ„±ν•˜μ‹œμ˜€.
         */

        MyThread mt1 = new MyThread("*");
        MyThread mt2 = new MyThread("+");

        mt1.start();
        mt2.start();

        System.out.println("end");

    }
}

πŸ₯Ž Runnable Interfaceλ₯Ό κ΅¬ν˜„ν•΄μ„œ Thread μž‘μ„±ν•˜κΈ°

  • Threadκ°€ Xxxλ₯Ό 가진닀.
class Xxx implements Runnable {
	public void run(){
    	// λ™μ‹œμ— 싀행될 μ½”λ“œ
    }
}
Xxx x = new Xxx();
Thread t = new Thread(x);
t.start();

πŸŽ―μ½”λ“œ μž‘μ„± μˆœμ„œ

  1. Runnable μΈν„°νŽ˜μ΄μŠ€λ₯Ό κ΅¬ν˜„ν•œλ‹€.
  2. run()λ©”μ†Œλ“œλ₯Ό μ˜€λ²„λΌμ΄λ”© ν•œλ‹€.
    (1,2λ₯Ό 톡해 λ§Œλ“€μ–΄μ§„ 클래슀λ₯Ό 객체둜 λ§Œλ“€μ–΄ μ‚¬μš©ν•œλ‹€.)
  3. ThreadμΈμŠ€ν„΄μŠ€λ₯Ό μƒμ„±ν•˜λŠ”λ°, μƒμ„±μžμ— RunnableμΈμŠ€ν„΄μŠ€λ₯Ό λ„£μ–΄μ€€λ‹€.
  4. Threadκ°€ 가지고 μžˆλŠ” start() λ©”μ†Œλ“œλ₯Ό ν˜ΈμΆœν•œλ‹€.
MyRunnable μ†ŒμŠ€μ½”λ“œ
package totojava.thread;


// 1. RunnableμΈν„°νŽ˜μ΄μŠ€λ₯Ό κ΅¬ν˜„ν•œλ‹€.
public class MyRunnable implements Runnable{

    private String str;
    public MyRunnable(String str){
        this.str = str;
    }

    // 2. run()λ©”μ†Œλ“œλ₯Ό μ˜€λ²„λΌμ΄λ”© ν•œλ‹€.
    @Override
    public void run() {
        String name = Thread.currentThread().getName();
        System.out.println("---" + name + "----");
        for(int i=0;i<10;i++){
            System.out.print(str);
            try {
                Thread.sleep(1000); // 1μ΄ˆκ°„ μ‰°λ‹€
            }catch(InterruptedException e){
                e.printStackTrace();
            }
        }
    }
}

MyThreadExam2 μ†ŒμŠ€μ½”λ“œ


package totojava.thread;

public class MyThreadExam2 {
    public static void main(String[] args) {

        String name = Thread.currentThread().getName();
        System.out.println("thread name : " + name);
        System.out.println("start!");
        /*
         1μ΄ˆλ§ˆλ‹€ *λ₯Ό 좜λ ₯ν•΄μ„œ 10번 좜λ ₯ν•˜λŠ” ν”„λ‘œκ·Έλž¨μ„ μž‘μ„±ν•˜μ‹œμ˜€.
         */

        MyRunnable mr1 = new MyRunnable("*");
        MyRunnable mr2 = new MyRunnable("+");

        // 3. ThreadμΈμŠ€ν„΄μŠ€λ₯Ό μƒμ„±ν•˜λŠ”λ°, μƒμ„±μžμ— RunnableμΈμŠ€ν„΄μŠ€λ₯Ό λ„£μ–΄μ€€λ‹€.
        Thread t1 = new Thread(mr1);
        Thread t2 = new Thread(mr2);

        // 4. Threadκ°€ κ°–κ³  μžˆλŠ” start() λ©”μ†Œλ“œλ₯Ό ν˜ΈμΆœν•œλ‹€.
        t1.start();
        t2.start();

        System.out.println("end");

    }
}
profile
κ·Έλž˜μ•Όλ§Œ ν•œλ‹€

0개의 λŒ“κΈ€