>  기사  >  Java  >  Java에서 스레드를 생성하는 세 가지 방법은 무엇입니까?

Java에서 스레드를 생성하는 세 가지 방법은 무엇입니까?

青灯夜游
青灯夜游원래의
2020-11-23 16:51:476765검색

Java에서 스레드를 생성하는 세 가지 방법은 다음과 같습니다. 1. Thread 클래스를 상속하여 스레드를 생성합니다. 2. Runnable 인터페이스를 구현하여 스레드를 생성합니다. 3. Callable 및 Future를 사용하여 스레드를 생성합니다.

Java에서 스레드를 생성하는 세 가지 방법은 무엇입니까?

Java는 Thread 클래스를 사용하여 스레드를 나타내며 모든 스레드 개체는 Thread 클래스 또는 해당 하위 클래스의 인스턴스여야 합니다. Java는 다음과 같은 세 가지 방법으로 스레드를 생성할 수 있습니다.

1) Thread 클래스를 상속하여 스레드를 생성합니다.

2) Runnable 인터페이스를 구현하여 스레드를 생성합니다.

3) Callable 및 Future를 사용하여 스레드 생성

스레드를 생성하는 세 가지 방법을 각각 살펴보겠습니다.

------------스레드 생성을 위해 Thread 클래스 상속------------ --- -----

Thread 클래스를 상속하여 멀티 스레드를 생성하고 시작하는 일반적인 단계는 다음과 같습니다

1】D Thread 클래스의 하위 클래스를 정의하고 run을 재정의합니다. () 클래스의 메소드 중 이 메소드의 메소드 본문은 스레드가 완료해야 하는 작업이며 run() 메소드를 스레드 실행 본문이라고도 합니다.

2】Thread 하위 클래스의 인스턴스 생성, 즉 스레드 개체 생성

3】스레드 시작, 즉 스레드의 start() 메서드 호출

코드 예제

public class MyThread extends Thread{//继承Thread类
  public void run(){
  //重写run方法
  }
}
public class Main {
  public static void main(String[] args){
    new MyThread().start();//创建并启动线程
  }
}

-- --------스레드 생성을 위한 Runnable 인터페이스 구현---------------- -----

Runnable 인터페이스를 구현하여 스레드를 생성하고 시작하는 일반적인 단계는 다음과 같습니다.

1] Runnable 인터페이스의 구현 클래스를 정의하고 run()을 다시 작성합니다. 이 run() 메소드는 Thread의 run() 메소드와 동일합니다. 스레드의 실행 본문도 동일합니다

2] Runnable 구현 클래스의 인스턴스를 생성하고 이 인스턴스를 대상으로 사용합니다. 이 Thread 개체는 실제 스레드 개체입니다

3] 세 번째 부분은 여전히 ​​스레드 개체의 start() 메서드를 호출하여 시작됩니다.

코드 예:

public class MyThread2 implements Runnable {//实现Runnable接口
  public void run(){
  //重写run方法
  }
}
public class Main {
  public static void main(String[] args){
    //创建并启动线程
    MyThread2 myThread=new MyThread2();
    Thread thread=new Thread(myThread);
    thread().start();
    //或者    new Thread(new MyThread2()).start();
  }
}

-------------------------Callable을 사용하여 Future로 스레드 만들기 ----------------- ---------

Runnable 인터페이스와 달리 Callable 인터페이스는 스레드 실행 본문으로 call() 메서드를 제공하며, call() 메서드는 run() 메서드보다 더 강력합니다 .

》call() 메소드는 반환 값을 가질 수 있습니다

》call() 메소드는 예외를 발생시키도록 선언될 수 있습니다.

Java5는 호출의 반환 값을 나타내는 Future 인터페이스를 제공합니다( ) 메소드가 있으며 Future 인터페이스에는 FutureTask 구현 클래스가 제공됩니다. 이 구현 클래스는 Future 인터페이스와 Runnable 인터페이스를 모두 구현하므로 Thread 클래스의 대상으로 사용할 수 있습니다. 연관된 호출 가능 태스크를 제어하기 위해 Future 인터페이스에 여러 공개 메소드가 정의되어 있습니다.

>boolean cancel(boolean mayInterruptIfRunning): View는 Future

>V get(): Callable에서 call() 메소드의 반환 값을 반환합니다. 이 메소드를 호출하면 프로그램이 다음을 수행합니다. 자식 스레드가 종료된 후 반환 값을 얻을 때까지 기다려야 합니다.

> V get(long timeout, TimeUnit 단위): Callable에서 call() 메서드의 반환 값을 반환합니다. 최대 시간 초과 동안 차단됩니다. 지정된 시간 이후에 반환이 발생하지 않으면 TimeoutException이 발생합니다

> ;boolean isDone(): Callable 작업이 완료되면 True를 반환합니다

>boolean isCancelled(): Callable 작업이 이전에 취소된 경우 Callable 작업이 정상적으로 완료되면 True를 반환합니다

관련 개념을 소개한 후 반환 값을 생성하고 시작합니다. 스레드의 단계는 다음과 같습니다.

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

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

3] FutureTask 객체를 Thread 객체의 대상으로 사용하여 생성합니다. 그리고 스레드를 시작합니다(FutureTask가 Runnable 인터페이스를 구현했기 때문에)

4] 하위 스레드 실행이 끝난 후 반환 값을 얻으려면 FutureTask 개체의 get() 메서드를 호출하세요

코드 예:

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();
   }
  }
}

---------- ----------------3가지 스레드 생성 방법 비교---- ------------- --------

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

1. 스레드는 Runnable 또는 Callable 인터페이스만 구현하며 다른 클래스도 상속할 수 있습니다.

2. 이런 방식으로 여러 스레드가 대상 개체를 공유할 수 있으며, 이는 여러 스레드가 동일한 리소스를 처리하는 상황에 매우 적합합니다.

3. 하지만 프로그래밍이 약간 복잡합니다. 현재 스레드에 액세스해야 하는 경우 Thread.currentThread() 메서드를 호출해야 합니다.

4. Thread 클래스를 상속하는 스레드 클래스는 다른 상위 클래스를 상속할 수 없습니다(Java 단일 상속 결정).

참고: 일반적으로 멀티 스레드를 생성하기 위해 인터페이스를 구현하는 것이 좋습니다

더 많은 프로그래밍 관련 지식을 보려면 프로그래밍 비디오 코스를 방문하세요! !

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

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.