본문 바로가기

JAVA/김영한 자바

Thread 생성 방법

 

 

 


Thread 생성 방법은? 

1. Thread 클래스 상속 

public class MyThread extends Thread {
    @Override
    public void run() {
        // 스레드가 수행할 작업을 여기에 정의
        System.out.println("Thread running.");
    }

    public static void main(String[] args) {
        MyThread thread = new MyThread();
        thread.start();  // 스레드 시작
    }
}

Thread class 상속 시 

 

장점: 

- run을 재정의만 하면 된다. -> 간단 

- 쓰레드 기능 다 쓸 수 있다. 

단점: 

- 상속 제한: 단일 상속만 가능, 다른 클래스를 상속 받을 수 없다 

 

2. Runnable 인터페이스 구현 (실제로 사용 많이 함) 

public class MyRunnable implements Runnable {
    @Override
    public void run() {
        // 스레드가 수행할 작업을 여기에 정의
        System.out.println("Runnable running.");
    }

    public static void main(String[] args) {
        Thread thread = new Thread(new MyRunnable());
        thread.start();  // 스레드 시작
    }
}

 

Runnable : 유연, 유지보수 쉬움 

장점: 

- 상속에서 자유롭다

 - 작업 내용과 스레드 분리 

- 작업과 실행을 분리 

- 쓰레드 모든 기능 가져올 필요 없잖니, 원하는 작업만 코드 작성 -> 코드 가독성 증가 

- 여러 스레드가 동일한 Runnable 객체를 공유 -> 자원관리 효율 

- 작업을 생성자로 전달

 

3. Callable 인터페이스를 사용하여 스레드 생성

Callable 인터페이스는 Runnable과 비슷하지만, call() 메소드를 사용하여 결과를 반환할 수 있습니다.

Callable을 사용하는 경우 Future 객체를 통해 결과를 얻을 수 있습니다.

import java.util.concurrent.Callable;
import java.util.concurrent.ExecutionException;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.Future;

public class MyCallable implements Callable<String> {
    @Override
    public String call() {
        // 스레드가 수행할 작업을 여기에 정의
        return "Callable result";
    }

    public static void main(String[] args) {
        ExecutorService executor = Executors.newSingleThreadExecutor();
        Future<String> future = executor.submit(new MyCallable());
        
        try {
            String result = future.get();  // 스레드 작업 결과 가져오기
            System.out.println(result);
        } catch (InterruptedException | ExecutionException e) {
            e.printStackTrace();
        } finally {
            executor.shutdown();
        }
    }
}

 

4. 람다 표현식으로 스레드 생성

Java 8부터는 람다 표현식을 사용하여 Runnable을 간단하게 구현할 수 있습니다.

public class LambdaThread {
    public static void main(String[] args) {
        Runnable runnable = () -> {
            // 스레드가 수행할 작업을 여기에 정의
            System.out.println("Lambda Runnable running.");
        };
        
        Thread thread = new Thread(runnable);
        thread.start();  // 스레드 시작
    }
}

 

 

 

5. ExecutorService를 사용하여 스레드 관리

ExecutorService를 사용하면 스레드 풀을 관리할 수 있어 스레드 생성을 더 쉽게 관리할 수 있습니다.

import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;

public class ExecutorExample {
    public static void main(String[] args) {
        ExecutorService executor = Executors.newFixedThreadPool(2);
        
        executor.submit(() -> {
            // 스레드가 수행할 작업을 여기에 정의
            System.out.println("Task 1 running.");
        });
        
        executor.submit(() -> {
            // 스레드가 수행할 작업을 여기에 정의
            System.out.println("Task 2 running.");
        });
        
        executor.shutdown();  // Executor 종료
    }
}

 

'JAVA > 김영한 자바' 카테고리의 다른 글

thread join  (0) 2024.08.21