> Java > Java베이스 > 본문

Java에서 멀티스레딩을 구현하는 여러 가지 방법

王林
풀어 주다: 2019-12-04 16:43:08
원래의
4894명이 탐색했습니다.

Java에서 멀티스레딩을 구현하는 여러 가지 방법

Java 멀티스레딩을 사용하는 방법에는 세 가지가 있습니다. Thread 클래스 상속, Runnable 인터페이스 구현, Callable 및 Future를 사용하여 스레드 생성입니다.

1. Thread 클래스 상속

구현 방법은 매우 간단합니다. Thread 클래스를 상속하는 클래스를 만든 다음 기본 메서드에서 start 메서드를 호출하면 됩니다. 멀티스레딩을 동시에 달성하기 위한 클래스 인스턴스 객체입니다. 코드:

public class MyThread extends Thread {
    @Override
    public void run(){        
        super.run();
        System.out.println("执行子线程...");
    }
}
로그인 후 복사

테스트 케이스:

public class Test {
    public static void main(String[] args) {
        MyThread myThread = new MyThread();
        myThread.start();
        System.out.println("主线程...");
    }
}
로그인 후 복사

실행 결과:

Java에서 멀티스레딩을 구현하는 여러 가지 방법

물론 여기의 결과는 스레드의 실행 순서를 나타내지는 않습니다. 스레드를 여러 번 실행하면 인쇄가 됩니다. 순서는 다를 수 있습니다. 멀티 스레드 실행 중에 CPU는 불확실한 방식으로 스레드를 실행하므로 실행 결과는 코드의 실행 순서나 호출 순서와 아무런 관련이 없으며 실행 결과도 다를 수 있습니다.

무료 동영상 튜토리얼 추천: java 학습 동영상

여기서 주목해야 할 또 다른 점은 myThread의 시작 메소드는 run() 메소드가 아닌 메인 메소드에서 호출되어야 한다는 것입니다. start() 메서드를 호출하면 이 스레드가 실행될 준비가 되었음을 CPU에 알리고 시스템은 시간이 있을 때 run() 메서드를 실행할 것입니다.

run() 메서드를 직접 호출하면 비동기식으로 실행되지 않고, 함수를 호출하는 것처럼 순차적으로 동기식으로 실행되므로 멀티스레딩의 의미가 사라집니다.

2. Runnable 인터페이스 구현

이 메소드의 구현도 매우 간단합니다. 이는 Thread 클래스의 상속을 변경하여 Runnable 인터페이스를 구현하는 것입니다. 코드는 다음과 같습니다.

public class MyRunnable implements Runnable {    
    @Override
    public void run() {
        System.out.println("执行子线程...");
    }
}
로그인 후 복사

테스트 케이스:

public class Test {    
    public static void main(String[] args) {
        Runnable runnable = new MyRunnable();
        Thread thread = new Thread(runnable);
        thread.start();
        System.out.println("主线程运行结束!");
    }
}
로그인 후 복사

실행 결과:

Java에서 멀티스레딩을 구현하는 여러 가지 방법

실행 결과에 대해서는 말할 것도 없습니다. 여기 메인에서는 실제로 Thread를 통해 새 스레드가 생성되는 것을 볼 수 있습니다.

Thread thread = new Thread(runnable);
로그인 후 복사

이 단계는 Thread 클래스에 속합니다. 이 기능은 run() 메서드를 스레드 실행 본문으로 패키징한 다음 start를 사용하여 이 스레드의 실행을 예약할 준비가 되었음을 시스템에 알리는 것입니다.

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

위의 두 가지 방법에는 다음 두 가지 문제가 있습니다.

1 실행 방법에서 반환 값을 얻을 수 없습니다. 이상.

이 두 가지 문제를 해결하려면 Callable 인터페이스를 사용해야 합니다. 인터페이스라고 하면 위의 Runnable 인터페이스 구현 클래스 인스턴스가 Thread 클래스의 생성자의 매개변수로 전달되고 Run 메소드의 내용이 Thread의 시작을 통해 실행됩니다. 그러나 Callable은 Runnable의 하위 인터페이스가 아니라 완전히 새로운 인터페이스입니다. 해당 인스턴스는 Thread 구성으로 직접 전달될 수 없으므로 이를 변환하려면 다른 인터페이스가 필요합니다.

Java5는 Callable 인터페이스에서 call() 메소드의 반환 값을 표현하기 위해 Future 인터페이스를 제공하고, Future 인터페이스에 대한 구현 클래스인 FutureTask를 제공합니다. 구현 클래스의 상속 관계는 그림과 같습니다.

Java에서 멀티스레딩을 구현하는 여러 가지 방법보시다시피 이 구현 클래스는 Future 인터페이스를 구현할 뿐만 아니라 Runnable 인터페이스도 구현하므로 Thread 생성자에 직접 전달할 수 있습니다.

FutureTask의 생성자는 다음과 같습니다.

그래서 실제로는 이전 방법보다 변환 프로세스가 하나 더 추가됩니다. 결국 Thread의 시작을 통해 새로운 스레드가 생성됩니다. 이 아이디어를 사용하면 코드를 이해하기 쉽습니다.

import java.util.concurrent.Callable;
public class MyCallable implements Callable {    
int i = 0;    
@Override
    public Object call() throws Exception {
        System.out.println(Thread.currentThread().getName()+"  i的值:"+ i);        
        return i++; //call方法可以有返回值
    }
}
로그인 후 복사

테스트:

import java.util.concurrent.Callable;
import java.util.concurrent.FutureTask;
public class Test {
    public static void main(String[] args) {
        Callable callable = new MyCallable();        
        for (int i = 0; i < 10; i++) {
            FutureTask task = new FutureTask(callable);            
            new Thread(task,"子线程"+ i).start();            
            try {                //获取子线程的返回值
                System.out.println("子线程返回值:"+task.get() + "\n");
            }  catch (Exception e) {
                e.printStackTrace();
            }
        }
    }
}
로그인 후 복사

실행 결과(부분):

Java에서 멀티스레딩을 구현하는 여러 가지 방법추천 관련 기사 튜토리얼:

java 입력 프로그램

위 내용은 Java에서 멀티스레딩을 구현하는 여러 가지 방법의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

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