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 |
---|