πŸ“™ Thread? Process?

Javaλ₯Ό κ³΅λΆ€ν•˜λ©΄μ„œ ThreadλΌλŠ” κ°œλ…μ„ μ ‘ν–ˆμ„λ•ŒλŠ” ꡉμž₯히 λ‚―μ„€κ³  μ²˜μŒμ΄λΌμ„œ μ–΄μƒ‰ν•œ μš©μ–΄λ“€μ΄ ꡉμž₯히 λ§Žμ•˜μŠ΅λ‹ˆλ‹€. μ œκ°€ 7μ‚΄λ•Œ 처음 컴퓨터λ₯Ό κ΅¬μž…ν•΄μ„œ μ‚¬μš©ν–ˆμœΌλ‹ˆ 20λ…„ κ°€κΉŒμ΄ PCλ₯Ό μ¨μ˜€λ©΄μ„œ κ·Έλž˜λ„ μ§€κΈˆ μ•Œμ•„λ³Ό λ‘κ°œμ˜ λ‹¨μ–΄λŠ” 많이 듣지 μ•Šμ•˜λ‚˜ 생각이 λ“­λ‹ˆλ‹€.

  • ν”„λ‘œκ·Έλž¨(program) : μ›ν•˜λŠ” μ–΄λ– ν•œ 일을 ν•˜κΈ° μœ„ν•΄ κ³„νšλœ 방법과 μ ˆμ°¨μ— μ˜ν•΄ μž‘μ„±λœ 일련의 μˆœμ„œλ‚˜ λͺ©λ‘μ„ λ§ν•©λ‹ˆλ‹€. μ‚¬μš©μžκ°€ μš”μ²­ν•œ μž‘μ—…μ„ μ²˜λ¦¬ν•˜κΈ° μœ„ν•΄ ν”„λ‘œκ·Έλž˜λ¨Έμ— μ˜ν•΄ μž‘μ„±λœ λͺ…λ Ήμ˜ 집합(λͺ¨μŒ)으둜 μ„€λͺ…ν•  수 μžˆκ² μŠ΅λ‹ˆλ‹€.
  • ν”„λ‘œμ„ΈμŠ€(process) : ν”„λ‘œμ„ΈμŠ€λŠ” μ‹€ν–‰ 쀑인 ν”„λ‘œκ·Έλž¨μ„ λ§ν•©λ‹ˆλ‹€. ν”„λ‘œμ„ΈμŠ€λŠ” ν”„λ‘œκ·Έλž¨μ„ μˆ˜ν–‰ν•˜λŠ” 데 ν•„μš”ν•œ 데이터와 λ©”λͺ¨λ¦¬ λ“±μ˜ μžμ›, 그리고 μ“°λ ˆλ“œλ‘œ κ΅¬μ„±λ˜μ–΄ μžˆμŠ΅λ‹ˆλ‹€.

🎯 κ·Έλž˜μ„œ Threadκ°€ λ­”λ°μš”?

μœ„μ—μ„œ ν”„λ‘œμ„ΈμŠ€λŠ” ν”„λ‘œκ·Έλž¨μ„ μˆ˜ν–‰ν•˜λŠ” 데 ν•„μš”ν•œ 데이터와 λ©”λͺ¨λ¦¬ λ“±μ˜ μžμ›, 그리고 μ“°λ ˆλ“œλ‘œ κ΅¬μ„±λ˜μ–΄ μžˆλ‹€κ³  μ•Œμ•„ λ³΄μ•˜μŠ΅λ‹ˆλ‹€.
λͺ¨λ“  ν”„λ‘œμ„ΈμŠ€μ—λŠ” μ΅œμ†Œν•œ ν•˜λ‚˜ μ΄μƒμ˜ μ“°λ ˆλ“œκ°€ μ‘΄μž¬ν•˜λ©°, λ‘˜ μ΄μƒμ˜ μ“°λ ˆλ“œλ₯Ό 가진 ν”„λ‘œμ„ΈμŠ€λ₯Ό 'λ©€ν‹° μ“°λ ˆλ“œ ν”„λ‘œμ„ΈμŠ€' 라고 ν•©λ‹ˆλ‹€.

ν”„λ‘œμ„ΈμŠ€ = 곡μž₯, μ“°λ ˆλ“œ = 일꾼으둜 μƒκ°ν•˜λ©΄ μ‹±κΈ€ μ“°λ ˆλ“œμ™€ λ©€ν‹° μ“°λ ˆλ“œλ₯Ό μ΄ν•΄ν•˜κΈ° μ‰½μŠ΅λ‹ˆλ‹€. ν•œ 곡μž₯에 일꾼이 ν•œλͺ…이라면 μ‹±κΈ€ μ“°λ ˆλ“œμ΄κ³ , ν•œ 곡μž₯에 일꾼이 μ—¬λŸΏμ΄λΌλ©΄(2λͺ… 이상) λ©€ν‹° μ“°λ ˆλ“œ μž…λ‹ˆλ‹€.

βœ” ν•˜λ‚˜μ˜ ν”„λ‘œμ„ΈμŠ€κ°€ κ°€μ§ˆ 수 μžˆλŠ” μ“°λ ˆλ“œμ˜ μˆ˜λŠ” μ œν•œλ˜μ–΄ μžˆμ§€ μ•Šμ§€λ§Œ, μ“°λ ˆλ“œκ°€ μž‘μ—…μ„ μˆ˜ν–‰ν•˜λŠ”λ° κ°œλ³„μ μΈ λ©”λͺ¨λ¦¬ 곡간(ν˜ΈμΆœμŠ€νƒ)을 ν•„μš”λ‘œ ν•˜κΈ° λ•Œλ¬Έμ— ν”„λ‘œμ„ΈμŠ€μ˜ λ©”λͺ¨λ¦¬ ν•œκ³„μ— 따라 생성할 수 μžˆλŠ” μ“°λ ˆλ“œμ˜ μˆ˜κ°€ κ²°μ •λ©λ‹ˆλ‹€.

πŸ‘ λ©€ν‹° νƒœμŠ€ν‚Ή? λ©€ν‹° μ“°λ ˆλ“œ?

μ €λŠ” 보톡 PCλ₯Ό ν‚€κ±°λ‚˜ μž‘μ—…μ„ ν•˜λ©΄, Chrome & IDE & DBλ“± λ§Žμ€ Tool듀을 λ™μ‹œμ— μ‹€ν–‰μ‹œν‚€κ³  μ‚¬μš©ν•©λ‹ˆλ‹€. 이것이 κ°€λŠ₯ν•œ μ΄μœ λŠ” λ¬΄μ—‡μΌκΉŒμš”?
μœˆλ„μš°μ™€ μœ λ‹‰μŠ€λ₯Ό ν¬ν•¨ν•œ λŒ€λΆ€λΆ„μ˜ OSλŠ” λ©€ν‹°νƒœμŠ€ν‚Ήμ„ μ§€μ›ν•˜κΈ° λ•Œλ¬Έμž…λ‹ˆλ‹€.

μ™œ μ“°λ ˆλ“œλ₯Ό μ„€λͺ…ν•˜λ©΄μ„œ λ©€ν‹° νƒœμŠ€ν‚Ήμ— λŒ€ν•΄μ„œ μ–ΈκΈ‰ν–ˆμ„κΉŒμš”? 눈치 μ±„μ…¨λ‚˜μš”?


응 눈치 λͺ»μ±„λ©΄ κ·Έλ§Œμ΄μ•Ό πŸ˜‚

이와 λ§ˆμ°¬κ°€μ§€λ‘œ λ©€ν‹°μ“°λ ˆλ”©μ€ ν•˜λ‚˜μ˜ ν”„λ‘œμ„ΈμŠ€ λ‚΄μ—μ„œ μ—¬λŸ¬ μ“°λ ˆλ“œκ°€ λ™μ‹œμ— μž‘μ—…μ„ μˆ˜ν–‰ν•˜λŠ” κ²ƒμž…λ‹ˆλ‹€. CPU의 μ½”μ–΄λŠ” ν•œ λ²ˆμ— 단 ν•˜λ‚˜μ˜ μž‘μ—…λ§Œ μˆ˜ν–‰ν•  수 μžˆμŠ΅λ‹ˆλ‹€.

μ‹€μ œλ‘œ λ™μ‹œμ— μ²˜λ¦¬λ˜λŠ” μž‘μ—…μ˜ κ°œμˆ˜λŠ” μ½”μ–΄μ˜ κ°œμˆ˜μ™€ μΌμΉ˜ν•©λ‹ˆλ‹€. κ·Έλž˜μ„œ CPU에 μ½”μ–΄μˆ˜κ°€ λ§Žμ€ 것을 μ„ νƒν•˜κ²Œ λ˜λŠ” 것이죠. μ“°λ ˆλ“œμ˜ μˆ˜λŠ” μ–Έμ œλ‚˜ μ½”μ–΄μ˜ κ°œμˆ˜λ³΄λ‹€ 훨씬 많기 λ•Œλ¬Έμ— 각 μ½”μ–΄κ°€ μ•„μ£Ό 짧은 μ‹œκ°„ λ™μ•ˆ μ—¬λŸ¬ μž‘μ—…μ„ λ²ˆκ°ˆμ•„ κ°€λ©° μˆ˜ν–‰ν•˜μ—¬ μ—¬λŸ¬ μž‘μ—…λ“€μ΄ λͺ¨λ‘ λ™μ‹œμ— μˆ˜ν–‰λ˜λŠ” κ²ƒμ²˜λŸΌ 보이게 ν•©λ‹ˆλ‹€.

πŸ‘€ λ©€ν‹°μ“°λ ˆλ”© λ„ˆμ˜ μž₯점을 λ³΄μ—¬μ€˜

λ„μŠ€μ™€ 같이 ν•œ λ²ˆμ— ν•œκ°€μ§€ μž‘μ—…λ§Œ ν•  수 μžˆλŠ” OS와 μœˆλ„μš°μ™€ 같이 λ©€ν‹°νƒœμŠ€ν‚Ήμ΄ κ°€λŠ₯ν•œ OS의 μ°¨μ΄λŠ” 이미 κ²½ν—˜μœΌλ‘œ 잘 μ•Œκ³  μžˆμœΌμ‹€κ±°λΌ μƒκ°ν•©λ‹ˆλ‹€.
μ „ λ„μŠ€ μ•ˆμ¨λ΄μ„œ λͺ°λΌμš” μ‘μ• κ±°λ“ μš”

λ©€ν‹°μ“°λ ˆλ”©μ˜ μž₯점을 λ‚˜μ—΄ν•œλ‹€λ©΄ μ•„λž˜μ™€ 같을 것 κ°™μŠ΅λ‹ˆλ‹€.

  • CPU의 μ‚¬μš©λ₯ μ„ ν–₯μƒμ‹œν‚΅λ‹ˆλ‹€.
  • μžμ›μ„ 보닀 효율적으둜 μ‚¬μš©ν•  수 μžˆμŠ΅λ‹ˆλ‹€.
  • μ‚¬μš©μžμ— λŒ€ν•œ 응닡성이 ν–₯μƒλ©λ‹ˆλ‹€.
  • μž‘μ—…μ΄ λΆ„λ¦¬λ˜μ–΄ μ½”λ“œκ°€ κ°„κ²°ν•΄μ§‘λ‹ˆλ‹€.

λ§Œμ•½μ— μΉœκ΅¬μ™€ μΉ΄μΉ΄μ˜€ν†‘μ„ ν•˜λŠ”λ° μΉœκ΅¬κ°€ 사진을 μ „μ†‘ν•˜λŠ” λ™μ•ˆ μ±„νŒ…μ„ ν•˜μ§€ λͺ»ν•˜κ³  λ©ˆμΆ°μ•Ό ν•œλ‹€λ©΄ 아무도 μΉ΄μΉ΄μ˜€ν†‘μ„ μ‚¬μš©ν•˜μ§€ μ•Šκ² μ£ ?

μš°λ¦¬κ°€ μΉ΄μΉ΄μ˜€ν†‘μ„ ν•˜λ©°, 사진을 보내고 νŒŒμΌμ„ λ‹€μš΄λ‘œλ“œ λ°›λŠ” λ™μ•ˆμ—λ„ μΉœκ΅¬μ™€ μ§€μ†μ μœΌλ‘œ μ±„νŒ…μ„ ν•  수 μžˆμ—ˆλ˜ 비밀은 μ±„νŒ… μ• ν”Œλ¦¬μΌ€μ΄μ…˜μ€ λ©€ν‹°μ“°λ ˆλ“œλ‘œ μž‘μ„±λ˜μ–΄ 있기 λ•Œλ¬Έμž…λ‹ˆλ‹€.

μ—¬λŸ¬ μ‚¬μš©μžμ—κ²Œ μ„œλΉ„μŠ€λ₯Ό ν•΄μ£ΌλŠ” μ„œλ²„ ν”„λ‘œκ·Έλž¨μ˜ 경우 λ©€ν‹°μ“°λ ˆλ“œλ‘œ μž‘μ„±ν•˜λŠ” 것은 선택이 μ•„λ‹Œ ν•„μˆ˜λΌκ³  봐야 ν• λ§ŒνΌ λ©€ν‹°μ“°λ ˆλ“œλŠ” μš°λ¦¬μ—κ²Œ λ§Žμ€ νŽΈλ¦¬ν•¨μ„ μ œκ³΅ν•΄μ™”μŠ΅λ‹ˆλ‹€.

μ‹±κΈ€μ“°λ ˆλ“œμ˜ 경우 μ‚¬μš©μžμ˜ μš”μ²­λ§ˆλ‹€ μƒˆλ‘œμš΄ ν”„λ‘œμ„ΈμŠ€λ₯Ό 생성해야 ν•˜λŠ” 것이 κ°€μž₯ 큰 λ‹¨μ μž…λ‹ˆλ‹€. ν”„λ‘œμ„ΈμŠ€λ₯Ό μƒμ„±ν•˜λŠ” 것이 μ“°λ ˆλ“œλ₯Ό μƒμ„±ν•˜λŠ” 것에 λΉ„ν•΄ 더 λ§Žμ€ μ‹œκ°„κ³Ό λ©”λͺ¨λ¦¬ 곡간이 ν•„μš”ν•˜κΈ° λ•Œλ¬Έμž…λ‹ˆλ‹€.

🐸 μ“°λ ˆλ“œλ₯Ό κ°€λ²Όμš΄ ν”„λ‘œμ„ΈμŠ€, 즉 κ²½λŸ‰ ν”„λ‘œμ„ΈμŠ€λΌκ³  λΆ€λ₯΄κΈ°λ„ ν•©λ‹ˆλ‹€.

λ©€ν‹°μ“°λ ˆλ“œκ°€ μž₯점만 μžˆλŠ” μ‚¬λž‘μŠ€λŸ¬μš΄ 쑴재라면, μ‹±κΈ€μ“°λ ˆλ“œ κ°œλ…μ„ μš°λ¦¬κ°€ μ•Œμ§€ λͺ»ν•΄λ„ 됬을 κ²ƒμž…λ‹ˆλ‹€. ν•˜μ§€λ§Œ λ©€ν‹°μ“°λ ˆλ“œλŠ” μ—¬λŸ¬ μ“°λ ˆλ“œκ°€ 같은 ν”„λ‘œμ„ΈμŠ€ λ‚΄μ—μ„œ μžμ›μ„ κ³΅μœ ν•˜λ©° μž‘μ—…μ„ μˆ˜ν–‰ν•˜κΈ° λ•Œλ¬Έμ— 동기화와 κ΅μ°©μƒνƒœ 같은 λ¬Έμ œλ“€μ΄ μžˆμŠ΅λ‹ˆλ‹€.

이 뢀뢄은 κ½€λ‚˜ μ€‘μš”ν•˜κΈ° λ•Œλ¬Έμ— 좔후에 λ”°λ‘œ ν¬μŠ€νŒ… ν•˜μ—¬ μ•Œμ•„λ³΄κ² μŠ΅λ‹ˆλ‹€.

😊 μ“°λ ˆλ“œλ₯Ό κ΅¬ν˜„ν•˜κ³  μ‹€ν–‰ν•΄ 보자!

Javaμ—μ„œ μ“°λ ˆλ“œλ₯Ό κ΅¬ν˜„ν•˜λŠ” 방법은 두 가지가 μžˆμŠ΅λ‹ˆλ‹€.
Thread 클래슀λ₯Ό μƒμ†λ°›λŠ” 방법과, Runnable μΈν„°νŽ˜μ΄μŠ€λ₯Ό κ΅¬ν˜„ν•˜λŠ” 방법이 μžˆλŠ”λ°μš”.
μ–΄λŠ μͺ½μ„ 선택해도 별 μ°¨μ΄λŠ” μ—†κ² μ§€λ§Œ, JavaλŠ” 닀쀑 상속을 μ§€μ›ν•˜μ§€ μ•ŠμœΌλ―€λ‘œ Thread 클래슀λ₯Ό 상속 λ°›μœΌλ©΄ λ‹€λ₯Έ 클래슀λ₯Ό 상속받지 λͺ»ν•˜κ²Œ λ©λ‹ˆλ‹€.

λ”°λΌμ„œ Runnable μΈν„°νŽ˜μ΄μŠ€λ₯Ό κ΅¬ν˜„ν•˜λŠ” 방법이 μΌλ°˜μ μž…λ‹ˆλ‹€.

// Thread 클래슀λ₯Ό μƒμ†λ°›λŠ” 방법
class MyThread extends Thread {
	@Override
    public void run() { /* μž‘ μ—… λ‚΄ 용 */ } 		// Thread 클래슀의 run()을 μ˜€λ²„λΌμ΄λ”©
}

// Runnable μΈν„°νŽ˜μ΄μŠ€λ₯Ό κ΅¬ν˜„ν•˜λŠ” 방법
class MyThread implements Runnable {
	@Override
    public void run() { /* μž‘ μ—… λ‚΄ 용 */ } 		// Runnable μΈν„°νŽ˜μ΄μŠ€μ˜ run()을 κ΅¬ν˜„
}

Runnable μΈν„°νŽ˜μ΄μŠ€μ˜ μ†ŒμŠ€λ₯Ό 보면 μ˜€λ‘œμ§€ run( )만 μ •μ˜λ˜μ–΄ μžˆλŠ” κ°„λ‹¨ν•œ μΈν„°νŽ˜μ΄μŠ€ μž…λ‹ˆλ‹€. Runnable μΈν„°νŽ˜μ΄μŠ€λ₯Ό κ΅¬ν˜„ν•˜λŠ” 방법은 κ°„λ‹¨ν•©λ‹ˆλ‹€.

μΆ”μƒλ©”μ„œλ“œμΈ run( )의 λͺΈν†΅{ }을 λ§Œλ“€μ–΄ 주기만 ν•˜λ©΄ κ΅¬ν˜„μ„ ν•  수 μžˆμŠ΅λ‹ˆλ‹€.

// Runnable μΈν„°νŽ˜μ΄μŠ€μ˜ μ†ŒμŠ€
public interface Runnable {
	public abstract void run();
}

κ·Έλ ‡λ‹€λ©΄ Thread 클래슀λ₯Ό μƒμ†λ°›λŠ” 방법과 Runnable μΈν„°νŽ˜μ΄μŠ€λ₯Ό κ΅¬ν˜„ν•˜λŠ” λ°©λ²•μœΌλ‘œ Threadλ₯Ό κ΅¬ν˜„ν•˜κ³  μ‹€ν–‰ν•˜λŠ” 예제λ₯Ό μ‚΄νŽ΄ λ³΄κ² μŠ΅λ‹ˆλ‹€.

// Thread κ΅¬ν˜„ & μ‹€ν–‰ 예제
public class ThreadEx1 {
    public static void main(String[] args) {

        ThreadEx1_1 t1 = new ThreadEx1_1();

        Runnable r = new ThreadEx1_2();
        Thread t2 = new Thread(r);          // μƒμ„±μž Thread(Runnable target)

        t1.start();
        t2.start();
    }
}

/*
	Thread 클래슀λ₯Ό 상속
*/
class ThreadEx1_1 extends Thread {

    @Override
    public void run() {
        for(int i=0; i<5; i++){
            System.out.println(getName());
        }
    }
}

/*
	Runnable μΈν„°νŽ˜μ΄μŠ€λ₯Ό κ΅¬ν˜„
*/
class ThreadEx1_2 implements Runnable {

    @Override
    public void run() {
        for(int i=0; i<5; i++){
            // Thread.currentThread() - ν˜„μž¬ 싀행쀑인 Threadλ₯Ό λ°˜ν™˜ν•œλ‹€.
            System.out.println(Thread.currentThread().getName());
        }
    }
}

μœ„μ˜ 예제λ₯Ό 보면 Thread 클래슀λ₯Ό 상속받은 κ²½μš°μ™€ Runnable μΈν„°νŽ˜μ΄μŠ€λ₯Ό κ΅¬ν˜„ν•œ 경우의 μΈμŠ€ν„΄μŠ€ 생성 방법이 λ‹€λ¦…λ‹ˆλ‹€.

  • Thread 클래슀λ₯Ό 상속받은 경우
ThreadEx_1 t1 = new ThreadEx1_1();  // Thread의 μžμ† 클래슀의 μΈμŠ€ν„΄μŠ€λ₯Ό 생성
  • Runnable μΈν„°νŽ˜μ΄μŠ€λ₯Ό κ΅¬ν˜„ν•œ 경우
Runnable r = new ThreadEx1_2(); 	// Runnable을 κ΅¬ν˜„ν•œ 클래슀의 μΈμŠ€ν„΄μŠ€λ₯Ό 생성
Thread t2 = new Thread(r);			// μƒμ„±μž Thread(Runnable target)

// μœ„μ˜ μ½”λ“œ 두쀄을 κ°„λ‹¨νžˆ ν•œμ€„λ‘œ ν•˜κΈ°
Thread t2 = new Thread(new ThreadEx1_2());

Runnable μΈν„°νŽ˜μ΄μŠ€λ₯Ό κ΅¬ν˜„ν•œ κ²½μš°μ—, Runnable μΈν„°νŽ˜μ΄μŠ€λ₯Ό κ΅¬ν˜„ν•œ 클래슀의 μΈμŠ€ν„΄μŠ€λ₯Ό μƒμ„±ν•œ λ‹€μŒ, 이 μΈμŠ€ν„΄μŠ€λ₯Ό Thread 클래슀의 μƒμ„±μžμ˜ λ§€κ°œλ³€μˆ˜λ‘œ μ œκ³΅ν•΄μ•Ό ν•©λ‹ˆλ‹€.

public class Thread {
	...
    private Runnable target;  // Runnable을 κ΅¬ν˜„ν•œ 클래슀의 μΈμŠ€ν„΄μŠ€λ₯Ό μ°Έμ‘°ν•˜κΈ° μœ„ν•œ λ³€μˆ˜
    
    // Thread의 μƒμ„±μž
    public Thread(Runnable target) {
        this(null, target, "Thread-" + nextThreadNum(), 0);
    }
    
    // run()을 μ˜€λ²„λΌμ΄λ”©
    // Runnable μΈν„°νŽ˜μ΄μŠ€λ₯Ό κ΅¬ν˜„ν•œ 클래슀의 run()을 호좜
    @Override
    public void run() {
        if (target != null) {
            target.run();
        }
    }
}

μœ„μ˜ 예제 μ½”λ“œλŠ” μ‹€μ œ Thread 클래슀의 μ†ŒμŠ€μ½”λ“œ 쀑 일뢀 μž…λ‹ˆλ‹€. 이 μ½”λ“œλ₯Ό 보면 run( )을 ν˜ΈμΆœν•˜λ©΄ μ°Έμ‘°λ³€μˆ˜ r을 ν†΅ν•΄μ„œ Runnable μΈν„°νŽ˜μ΄μŠ€λ₯Ό κ΅¬ν˜„ν•œ μΈμŠ€ν„΄μŠ€μ˜ run( )이 ν˜ΈμΆœλ©λ‹ˆλ‹€. λ”°λΌμ„œ 상속을 톡해 run( )을 μ˜€λ²„λΌμ΄λ”©ν•˜μ§€ μ•Šκ³ λ„ μ™ΈλΆ€λ‘œλΆ€ν„° run( )을 μ œκ³΅λ°›μ„ 수 μžˆλŠ” κ²ƒμž…λ‹ˆλ‹€.

🚦 Thread 상속 vs Runnable μΈν„°νŽ˜μ΄μŠ€ κ΅¬ν˜„

Thread 클래슀λ₯Ό μƒμ†λ°›μœΌλ©΄ μžμ† ν΄λž˜μŠ€μ—μ„œ 쑰상인 Thread 클래슀의 λ©”μ„œλ“œλ₯Ό 직접 ν˜ΈμΆœν•  수 μžˆμŠ΅λ‹ˆλ‹€. ν•˜μ§€λ§Œ Runnable을 κ΅¬ν˜„ν•˜λ©΄ Thread 클래슀의 λ©”μ„œλ“œμ— 직접 μ ‘κ·Όν•  수 μ—†μ£ .

그러면.. Runnable μ“°λ©΄ μ•ˆλ˜λŠ” κ±° μ•„λ‹Œκ°€μš”?

λ‹Ήμ—°νžˆ Runnable을 일반적으둜 μ‚¬μš©ν•œλ‹€κ³  λ§μ”€λ“œλ ΈμœΌλ‹ˆ 해결방법은 μžˆμŠ΅λ‹ˆλ‹€.
μ•„ μ–΄κ·Έλ‘œμ’€ 제발 그만 🀣🀭

Thread 클래슀의 static λ©”μ„œλ“œμΈ currentThread( )λ₯Ό ν˜ΈμΆœν•˜μ—¬ μ“°λ ˆλ“œμ— λŒ€ν•œ μ°Έμ‘°λ₯Ό μ–»μ–΄μ„œ 호좜이 κ°€λŠ₯ν•΄μ§‘λ‹ˆλ‹€.

// Threadλ₯Ό 상속받은 ν΄λž˜μŠ€μ—μ„œμ˜ λ©”μ„œλ“œ μ‚¬μš©
System.out.println(getName());

// Runnable μΈν„°νŽ˜μ΄μŠ€λ₯Ό κ΅¬ν˜„ν•œ ν΄λž˜μŠ€μ—μ„œμ˜ λ©”μ„œλ“œ μ‚¬μš©
System.out.println(Thread.currentThread().getName());

μœ„μ˜ 예제 μ½”λ“œμ²˜λŸΌ Thread 클래슀λ₯Ό 상속받은 μžμ† ν΄λž˜μŠ€μ—μ„œλŠ” λ©”μ„œλ“œμ˜ μ΄λ¦„μœΌλ‘œ λ©”μ„œλ“œ 호좜이 κ°€λŠ₯ν–ˆλ‹€λ©΄, Runnable μΈν„°νŽ˜μ΄μŠ€λ₯Ό κ΅¬ν˜„ν•œ ν΄λž˜μŠ€μ—μ„œλŠ” Thread 클래슀의 static λ©”μ„œλ“œμΈ currentThread( ) λ©”μ„œλ“œλ‘œ Thread의 μ°Έμ‘°λ₯Ό 얻은 λ’€ 호좜이 κ°€λŠ₯ν•©λ‹ˆλ‹€.

μ˜€λŠ˜μ€ 업무가 λ§Žμ•„μ„œ μ—¬κΈ°κΉŒμ§€..

곧 λŒμ•„μ˜¬κ²Œμš” To Be Continue..

좜처 : μžλ°”μ˜ 정석 3rd Edition(λ„μš°μΆœνŒ, 남ꢁ성 μ €)

0개의 λŒ“κΈ€