>Java >Java시작하기 >Java에서 스레드를 생성하는 3가지 방법과 차이점

Java에서 스레드를 생성하는 3가지 방법과 차이점

青灯夜游
青灯夜游앞으로
2019-11-26 17:19:282998검색

Java에서 스레드를 만드는 방법은 무엇입니까? 다음 기사에서는 스레드를 생성하는 3가지 방법과 그 차이점을 소개합니다. 도움이 필요한 친구들이 모두 참고할 수 있기를 바랍니다.

Java에서 스레드를 생성하는 3가지 방법과 차이점

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

1. Thread 클래스를 상속합니다.

2. Callable 및 Future를 사용하여 생성합니다. 실.

[추천 학습:

java 동영상 튜토리얼

]

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이지만 thread2의 run 메소드보다 먼저 start 메소드가 호출되지만 thread2의 run 메소드 호출과 관련된 정보가 먼저 출력되므로 새 스레드를 생성하는 프로세스가 수행되지 않습니다. 메인 스레드의 후속 실행을 차단합니다.

2. Runnable 인터페이스 구현 Java에서 스레드를 생성할 때 Thread 클래스를 상속하는 것 외에도 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 인터페이스를 구현하여 하위 작업을 정의한 다음 실행을 위해 하위 작업을 Thread에 넘깁니다. 이 메소드는 Runnable을 Thread 클래스의 매개변수로 사용한 다음 Thread의 시작 메소드를 사용하여 하위 작업을 수행할 새 스레드를 생성해야 합니다. Runnable의 run 메소드를 호출하면 새로운 스레드가 생성되지 않습니다. 이 일반적인 메소드 호출은 아무런 차이가 없습니다.

실제로 Thread 클래스의 구현 소스 코드를 살펴보면 Thread 클래스가 Runnable 인터페이스를 구현하고 있음을 알 수 있습니다.

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

3. Callable 및 Future를 사용하여 스레드 만들기 Callable 인터페이스는 스레드 실행 본문으로 call() 메서드를 제공합니다. () 방법.

반환 값이 있는 스레드를 생성하고 시작하는 단계는 다음과 같습니다.

Callable 인터페이스의 구현 클래스를 생성하고 call() 메서드를 구현한 다음 구현 클래스의 인스턴스를 생성합니다(java8부터 시작). , Lambda 표현식을 사용하여 Callable 객체를 직접 생성할 수 있습니다.
  1. FutureTask 클래스를 사용하여 Callable 객체의 call() 메서드의 반환 값을 캡슐화하는 Callable 객체를 래핑합니다.
  2. FutureTask 객체를 Thread 객체의 대상으로 사용하여 스레드를 생성하고 시작합니다(FutureTask가 구현하기 때문). Runnable 인터페이스)
  3. Call FutureTask 객체의 get() 메서드는 하위 스레드 실행 후 반환 값을 얻는 데 사용됩니다.
  4. 다음은 예입니다.
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 클래스를 상속하는 메소드와 다릅니다.

1. 스레드는 Runnable 또는 Callable 인터페이스만 구현합니다. 다른 클래스도 상속받습니다.

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

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

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

PS: 일반적으로 인터페이스를 구현하여 다중 스레드를 생성하는 것이 좋습니다

이 기사는 Java 시작하기 칼럼에서 가져온 것입니다. 학습을 환영합니다!

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

성명:
이 기사는 cnblogs.com에서 복제됩니다. 침해가 있는 경우 admin@php.cn으로 문의하시기 바랍니다. 삭제