> Java > java지도 시간 > Java에서 스레드를 생성하는 3가지 방법 소개(코드)

Java에서 스레드를 생성하는 3가지 방법 소개(코드)

不言
풀어 주다: 2019-02-01 11:21:29
앞으로
2830명이 탐색했습니다.

이 글은 자바에서 스레드를 생성하는 세 가지 방법에 대한 소개(코드)입니다. 도움이 필요한 친구들이 참고할 수 있기를 바랍니다.

Java에서 스레드를 생성하려면 일반적으로 세 가지 방법이 있습니다.

  1. Thread 클래스 상속

    # 🎜🎜 #
  2. Runnable 인터페이스를 구현합니다.

  3. Callable 및 Future를 사용하여 스레드를 만듭니다.

1. Thread 클래스 상속

Thread 클래스를 상속받는 경우 실행을 재정의해야 합니다. 수행해야 할 작업은 메서드에 정의되어 있습니다.

class MyThread extends Thread{
    private static int num = 0;
     
    public MyThread(){
        num++;
    }
     
    @Override
    public void run() {
        System.out.println("主动创建的第"+num+"个线程");
    }
}
로그인 후 복사

자신만의 스레드 클래스를 만든 후 스레드 개체를 만든 다음 start() 메서드를 통해 스레드를 시작할 수 있습니다. run() 메소드는 스레드를 시작하기 위해 호출되지 않습니다. run 메소드는 수행해야 할 작업만 정의합니다. run 메소드가 호출되면 메인 스레드에서 run 메소드를 실행하는 것과 동일합니다. 이때는 정의된 작업을 수행하기 위해 새로운 스레드가 생성되지 않습니다.

public class Test {
    public static void main(String[] args)  {
        MyThread thread = new MyThread();
        thread.start();
    }
}
 
 
class MyThread extends Thread{
    private static int num = 0;
     
    public MyThread(){
        num++;
    }
     
    @Override
    public void run() {
        System.out.println("主动创建的第"+num+"个线程");
    }
}
로그인 후 복사

위 코드에서 start() 메소드를 호출하면 새로운 스레드가 생성됩니다. start() 메소드 호출과 run() 메소드 호출의 차이점을 구별하려면 다음 예를 살펴보십시오.

public class Test {
    public static void main(String[] args)  {
        System.out.println("主线程ID:"+Thread.currentThread().getId());
        MyThread thread1 = new MyThread("thread1");
        thread1.start();
        MyThread thread2 = new MyThread("thread2");
        thread2.run();
    }
}
 
 
class MyThread extends Thread{
    private String name;
     
    public MyThread(String name){
        this.name = name;
    }
     
    @Override
    public void run() {
        System.out.println("name:"+name+" 子线程ID:"+Thread.currentThread().getId());
    }
}
로그인 후 복사

실행 결과:


출력 결과에서 다음과 같은 결론을 도출할 수 있습니다.

1) thread1과 thread2의 스레드 ID가 다르며, thread2와 메인 스레드 ID가 다릅니다. 이는 동일하며 run 메소드를 통해 호출하면 새 스레드가 생성되지 않고 메인 스레드에서 직접 run 메소드가 실행된다는 것을 나타냅니다. 이는 일반 메소드 호출과 다르지 않습니다.

2) thread1의 start 메소드는 thread2의 run 메소드보다 먼저 호출됩니다. 첫 번째 출력은 thread2의 run 메소드 호출에 대한 관련 정보입니다. 이는 새 스레드를 생성하는 프로세스가 기본 스레드의 후속 실행을 차단하지 않음을 나타냅니다.

2. Runnable 인터페이스 구현

Thread 클래스를 상속하는 것 외에도 Java에서 스레드를 생성하면 비슷한 결과를 얻을 수 있습니다. Runnable 인터페이스 기능. Runnable 인터페이스를 구현하려면 해당 run 메서드를 재정의해야 합니다.

다음은 예입니다.

public class Test {
    public static void main(String[] args)  {
        System.out.println("主线程ID:"+Thread.currentThread().getId());
        MyRunnable runnable = new MyRunnable();
        Thread thread = new Thread(runnable);
        thread.start();
    }
}
 
 
class MyRunnable implements Runnable{
     
    public MyRunnable() {
         
    }
     
    @Override
    public void run() {
        System.out.println("子线程ID:"+Thread.currentThread().getId());
    }
}
로그인 후 복사

Runnable의 중국어 의미는 "작업"입니다. 이름에서 알 수 있듯이 Runnable 인터페이스를 구현하여 하위 작업을 정의한 다음 스레드에 의해 실행되는 하위 작업을 넘겨줍니다. 이 메소드는 Runnable을 Thread 클래스의 매개변수로 사용한 다음 Thread의 시작 메소드를 사용하여 하위 작업을 수행할 새 스레드를 생성해야 합니다. Runnable의 run 메소드를 호출하면 새로운 스레드가 생성되지 않습니다. 이 일반적인 메소드 호출은 아무런 차이가 없습니다.

사실 Thread 클래스의 구현 소스코드를 보면 Thread 클래스가 Runnable 인터페이스를 구현하고 있는 것을 알 수 있습니다.

Java에서는 이 두 가지 방법을 사용하여 하위 작업을 수행하는 스레드를 만들 수 있습니다. 어떤 방법을 선택할지는 각자의 필요에 따라 다릅니다. Thread 클래스를 직접 상속하는 것이 Runnable 인터페이스를 구현하는 것보다 간단해 보일 수 있지만 Java는 단일 상속만 허용하므로 사용자 정의 클래스가 다른 클래스를 상속해야 하는 경우 Runnable 인터페이스 구현만 선택할 수 있습니다.

3. Callable 및 Future를 사용하여 스레드 만들기

Runnable 인터페이스와 달리 Callable 인터페이스는 스레드 실행을 위한 call() 메서드를 제공합니다. 본문에서는 call() 메서드가 run() 메서드보다 더 강력합니다.

반환 값을 사용하여 스레드를 생성하고 시작하는 단계는 다음과 같습니다.

  1. Callable 인터페이스의 구현 클래스를 생성하고 구현합니다. call() 메소드, 그런 다음 구현 클래스의 인스턴스를 생성합니다(java8부터 시작하여 Lambda 표현식을 사용하여 Callable 객체를 직접 생성할 수 있습니다).

  2. FutureTask 클래스를 사용하여 Callable 객체의 call() 메서드 반환 값을 캡슐화하는 Callable 객체를 래핑합니다.

    # 🎜🎜 #
  3. FutureTask 객체를 Thread 객체의 대상으로 사용하여 스레드를 생성하고 시작합니다(FutureTask는 Runnable 인터페이스를 구현하기 때문입니다)
  4. Call the 하위 스레드 실행이 끝난 후 반환 값을 얻기 위한 FutureTask 개체의 get() 메서드
  5. 다음은 예입니다.
public class Main {

  public static void main(String[] args){

   MyThread3 th=new MyThread3();

   //使用Lambda表达式创建Callable对象

     //使用FutureTask类来包装Callable对象

   FutureTask<Integer> future=new FutureTask<Integer>(

    (Callable<Integer>)()->{

      return 5;

    }

    );

   new Thread(task,"有返回值的线程").start();//实质上还是以Callable对象来创建并启动线程

    try{

    System.out.println("子线程的返回值:"+future.get());//get()方法会阻塞,直到子线程执行结束才返回

    }catch(Exception e){

    ex.printStackTrace();

   }

  }

}
로그인 후 복사
#🎜 🎜#

스레드를 생성하는 세 가지 방법 비교:

Runnable 및 Callable 인터페이스를 구현하는 방법은 기본적으로 동일하지만 후자가 반환 값을 갖습니다. call() 메서드를 실행할 때 후자는 스레드 실행 본문 run() 메서드가 반환 값을 갖지 않을 때 반환 값이 없으므로 이 두 메서드는 하나로 분류될 수 있습니다. 이 메서드와 Thread 클래스를 상속하는 메서드의 차이점은 다음과 같습니다. Callable 인터페이스를 구현하고 다른 클래스에서도 상속할 수 있습니다.

이런 방식으로 여러 스레드가 대상 개체를 공유할 수 있으며, 이는 여러 스레드가 동일한 리소스를 처리하는 상황에 매우 적합합니다.
  1. 하지만 프로그래밍이 약간 복잡합니다. 현재 스레드에 액세스해야 하는 경우 Thread.currentThread() 메서드를 호출해야 합니다.
  2. Thread 클래스를 상속하는 스레드 클래스는 다른 상위 클래스를 상속할 수 없습니다(Java 단일 상속 결정).
  3. PS: 일반적으로 인터페이스를 구현하여 멀티 스레드를 생성하는 것이 좋습니다.

위 내용은 Java에서 스레드를 생성하는 3가지 방법 소개(코드)의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

관련 라벨:
원천:cnblogs.com
본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
인기 튜토리얼
더>
최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿