자바 스레드 예제
Java 스레드 예제에 오신 것을 환영합니다. 프로세스와 스레드는 두 가지 기본 실행 단위입니다. 동시성 프로그래밍은 Java 스레드와 더 관련이 있습니다.
프로세스
프로세스는 자체 포함된 실행 환경이며 프로그램 또는 응용 프로그램으로 볼 수 있습니다. 그러나 프로그램 자체에는 내부에 여러 프로세스가 포함되어 있습니다. Java 런타임 환경은 다양한 클래스와 프로그램을 프로세스로 포함하는 단일 프로세스로 실행됩니다.
실
스레드는 가벼운 프로세스라고 할 수 있습니다. 스레드는 생성하는 데 더 적은 리소스가 필요하고 프로세스에 존재하며 스레드는 프로세스 리소스를 공유합니다.
자바 스레드 예제

Java 스레드 이점
- 자바 스레드는 프로세스에 비해 가볍고 스레드 생성에 소요되는 시간과 자원이 적습니다.
- 스레드는 상위 프로세스 데이터 및 코드를 공유합니다.
- 스레드 간 컨텍스트 전환은 일반적으로 프로세스 간 전환보다 저렴합니다.
- 스레드 상호 통신은 프로세스 통신보다 상대적으로 쉽습니다.
Java는 프로그래밍 방식으로 스레드를 생성하는 두 가지 방법을 제공합니다.
- java.lang.Runnable 인터페이스 구현.
- java.lang.Thread 클래스 확장.
Java 스레드 예제 - Runnable 인터페이스 구현
클래스를 실행 가능하게 만들기 위해 java.lang.Runnable 인터페이스를 구현하고 public void run()
메서드에서 구현을 제공할 수 있습니다. 이 클래스를 Thread로 사용하려면 이 실행 가능한 클래스의 객체를 전달하여 Thread 객체를 생성한 다음 start()
메서드를 호출하여 run()
메서드를 실행해야 합니다. 별도의 스레드. 다음은 Runnable 인터페이스를 구현한 Java 스레드 예제입니다.
package com.journaldev.threads;
public class HeavyWorkRunnable implements Runnable {
@Override
public void run() {
System.out.println("Doing heavy processing - START "+Thread.currentThread().getName());
try {
Thread.sleep(1000);
//Get database connection, delete unused data from DB
doDBProcessing();
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("Doing heavy processing - END "+Thread.currentThread().getName());
}
private void doDBProcessing() throws InterruptedException {
Thread.sleep(5000);
}
}
Java 스레드 예제 - 스레드 클래스 확장
java.lang.Thread 클래스를 확장하여 자체 Java 스레드 클래스를 만들고 run()
메서드를 재정의할 수 있습니다. 그런 다음 개체를 만들고 start()
메서드를 호출하여 사용자 지정 Java 스레드 클래스 실행 메서드를 실행할 수 있습니다. 다음은 Thread 클래스를 확장하는 방법을 보여주는 간단한 Java 스레드 예제입니다.
package com.journaldev.threads;
public class MyThread extends Thread {
public MyThread(String name) {
super(name);
}
@Override
public void run() {
System.out.println("MyThread - START "+Thread.currentThread().getName());
try {
Thread.sleep(1000);
//Get database connection, delete unused data from DB
doDBProcessing();
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("MyThread - END "+Thread.currentThread().getName());
}
private void doDBProcessing() throws InterruptedException {
Thread.sleep(5000);
}
}
다음은 Java 스레드를 생성하고 실행하는 방법을 보여주는 테스트 프로그램입니다.
package com.journaldev.threads;
public class ThreadRunExample {
public static void main(String[] args){
Thread t1 = new Thread(new HeavyWorkRunnable(), "t1");
Thread t2 = new Thread(new HeavyWorkRunnable(), "t2");
System.out.println("Starting Runnable threads");
t1.start();
t2.start();
System.out.println("Runnable Threads has been started");
Thread t3 = new MyThread("t3");
Thread t4 = new MyThread("t4");
System.out.println("Starting MyThreads");
t3.start();
t4.start();
System.out.println("MyThreads has been started");
}
}
위의 자바 스레드 예제 프로그램의 출력은 다음과 같습니다.
Starting Runnable threads
Runnable Threads has been started
Doing heavy processing - START t1
Doing heavy processing - START t2
Starting MyThreads
MyThread - START Thread-0
MyThreads has been started
MyThread - START Thread-1
Doing heavy processing - END t2
MyThread - END Thread-1
MyThread - END Thread-0
Doing heavy processing - END t1
스레드를 시작하면 실행은 OS의 타임 슬라이싱 구현에 따라 달라지며 실행을 제어할 수 없습니다. 그러나 스레드 우선 순위를 설정할 수 있지만 그렇다고 해도 우선 순위가 높은 스레드가 먼저 실행된다는 보장은 없습니다. 위의 프로그램을 여러 번 실행하면 스레드 시작 및 종료 패턴이 없음을 알 수 있습니다.
실행 가능 대 스레드
클래스가 Thread로 실행되는 것보다 더 많은 기능을 제공하는 경우 Runnable 인터페이스를 구현하여 Thread로 실행하는 방법을 제공해야 합니다. 클래스의 유일한 목표가 Thread로 실행되는 것이라면 Thread 클래스를 확장할 수 있습니다. Java가 여러 인터페이스 구현을 지원하므로 Runnable 구현이 선호됩니다. Thread 클래스를 확장하면 다른 클래스를 확장할 수 없습니다. 팁: 스레드가 값을 반환하지 않지만 스레드가 일부 처리를 수행한 다음 결과를 클라이언트 프로그램에 반환하려는 경우 Java 8 기능 인터페이스를 확인하십시오.