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

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

不言
풀어 주다: 2018-09-25 15:49:14
원래의
4256명이 탐색했습니다.

이 기사에서 제공하는 내용은 Java에서 스레드를 생성하는 방법이 무엇인지입니다. Java에서 스레드를 생성하는 세 가지 방법에는 특정 참고 가치가 있습니다. 도움이 필요한 친구가 참고할 수 있기를 바랍니다.

1. Thread 클래스 생성 상속

Thread를 상속하고 run()을 다시 작성하면 스레드가 run 메서드에서 작업을 실행합니다. 생성된 서브클래스는 start() 메서드를 호출하여 스레드 메서드를 실행할 수 있습니다.

Thread가 구현한 스레드 클래스를 상속함으로써 스레드 클래스의 인스턴스 변수를 여러 스레드 간에 공유할 수 없습니다. (다른 Thread 객체를 생성해야 하며 당연히 공유되지 않음)

예:

/**
 * 通过继承Thread实现线程
 */
public class ThreadTest extends Thread{
  
  private int i = 0 ;

    @Override
    public void run() {
        for(;i<50;i++){
            System.out.println(Thread.currentThread().getName() + " is running " + i );
        }
    }

    public static void main(String[] args) {
        for(int j=0;j<50;j++){if(j=20){
                new ThreadTest().start() ;
                new ThreadTest().start() ;
            }
        }
    }
}
로그인 후 복사

2. Runnable 인터페이스를 통해 스레드 클래스를 생성합니다.

이 방법을 사용하려면 먼저 Runnable 인터페이스를 구현하기 위한 클래스를 정의하고 인터페이스 재작성 run() 메소드, 이 실행 메소드는 스레드 실행 본문입니다. 그런 다음 Thread 객체를 생성하기 위한 매개변수 대상으로 Runnable 구현 클래스의 객체를 생성합니다. 이 Thread 객체는 실제 스레드 객체입니다. Runnable 인터페이스를 구현하는 스레드 클래스는 서로 리소스를 공유합니다.

/**
 * 通过实现Runnable接口实现的线程类
 */
public class RunnableTest implements Runnable {
    private int i ;
    @Override
    public void run() {
        for(;i<50;i++){
            System.out.println(Thread.currentThread().getName() + " -- " + i);
        }
    }
    public static void main(String[] args) {
        for(int i=0;i<100;i++){
            System.out.println(Thread.currentThread().getName() + " -- " + i);
            if(i==20){
                RunnableTest runnableTest = new RunnableTest() ;
                new Thread(runnableTest,"线程1").start() ;
                new Thread(runnableTest,"线程2").start() ;
            }
        }
    }
}
로그인 후 복사

3. Callable과 Future를 사용하여 스레드 생성

Thread 클래스를 상속하고 Runnable 인터페이스를 구현한 것을 보면 알 수 있듯이 위 두 메서드 모두 반환 값을 가질 수 없고 선언할 수도 없습니다. 예외를 발생시킵니다. Callable 인터페이스는 이 두 가지 점을 실현합니다. Callable 인터페이스는 Runable 인터페이스의 업그레이드 버전과 같습니다. 이 인터페이스가 제공하는 call() 메서드는 스레드의 실행 본문 역할을 하며 반환 값을 허용합니다.

그러나 Callable 객체는 Thread 객체의 대상으로 직접 사용할 수 없습니다. 왜냐하면 Callable 인터페이스는 Java 5의 새로운 인터페이스이고 Runnable 인터페이스의 하위 인터페이스가 아니기 때문입니다. 이 문제에 대한 해결책은 call()의 반환 값을 받을 수 있는 Future 인터페이스를 도입하는 것입니다. Future 인터페이스는 Runnable 인터페이스의 하위 인터페이스이며 Thread 개체의 대상으로 사용할 수 있습니다. 게다가 Future 인터페이스는 FutureTask라는 구현 클래스를 제공합니다.

FutureTask는 Future 인터페이스와 Runnable 인터페이스를 구현하며 Thread 객체의 대상으로 사용할 수 있습니다.

 관계는 다음과 같습니다.

 

예:

import java.util.concurrent.Callable;
import java.util.concurrent.FutureTask;
public class CallableTest {
    public static void main(String[] args) {
        CallableTest callableTest = new CallableTest() ;
        //因为Callable接口是函数式接口,可以使用Lambda表达式
        FutureTask<Integer> task = new FutureTask<Integer>((Callable<Integer>)()->{
           int i = 0 ;
           for(;i<100;i++){
               System.out.println(Thread.currentThread().getName() + "的循环变量i的值 :" + i);
           }
           return i;
        });
       for(int i=0;i<100;i++){
           System.out.println(Thread.currentThread().getName()+" 的循环变量i : + i");
           if(i==20){
               new Thread(task,"有返回值的线程").start();
           }
       }
       try{
           System.out.println("子线程返回值 : " + task.get());
        }catch (Exception e){
           e.printStackTrace();
        }
    }
}
로그인 후 복사

Summary

위의 세 가지 방법을 통해 실제로는 클래스 상속과 인터페이스 구현이라는 두 가지 범주로 분류할 수 있습니다. 상속에 비해 인터페이스 구현은 더 유연할 수 있으며 Java의 단일 상속 메커니즘에 의해 제한되지 않습니다. 그리고 동일한 리소스를 멀티 스레드로 처리하는 데 적합한 인터페이스를 구현하여 리소스를 공유할 수 있습니다. 스레드 지식은 풍부하고 복잡하며 더 많은 세부 사항을 배우고 숙달해야 합니다.

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

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