웹사이트 검색

자바 스레드 예제


Java 스레드 예제에 오신 것을 환영합니다. 프로세스와 스레드는 두 가지 기본 실행 단위입니다. 동시성 프로그래밍은 Java 스레드와 더 관련이 있습니다.

프로세스

프로세스는 자체 포함된 실행 환경이며 프로그램 또는 응용 프로그램으로 볼 수 있습니다. 그러나 프로그램 자체에는 내부에 여러 프로세스가 포함되어 있습니다. Java 런타임 환경은 다양한 클래스와 프로그램을 프로세스로 포함하는 단일 프로세스로 실행됩니다.

스레드는 가벼운 프로세스라고 할 수 있습니다. 스레드는 생성하는 데 더 적은 리소스가 필요하고 프로세스에 존재하며 스레드는 프로세스 리소스를 공유합니다.

자바 스레드 예제

Java 스레드 이점

  1. 자바 스레드는 프로세스에 비해 가볍고 스레드 생성에 소요되는 시간과 자원이 적습니다.
  2. 스레드는 상위 프로세스 데이터 및 코드를 공유합니다.
  3. 스레드 간 컨텍스트 전환은 일반적으로 프로세스 간 전환보다 저렴합니다.
  4. 스레드 상호 통신은 프로세스 통신보다 상대적으로 쉽습니다.

Java는 프로그래밍 방식으로 스레드를 생성하는 두 가지 방법을 제공합니다.

  1. java.lang.Runnable 인터페이스 구현.
  2. 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 기능 인터페이스를 확인하십시오.