>Java >java지도 시간 >자바는 멀티스레드인가요?

자바는 멀티스레드인가요?

(*-*)浩
(*-*)浩원래의
2019-11-09 13:44:393330검색

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

자바는 멀티스레드인가요?

Inherit Thread class(추천 학습: java 과정) # 🎜🎜#)

구현은 매우 간단합니다. 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("主线程...");
    }
}

실행 결과:

자바는 멀티스레드인가요?

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("主线程运行结束!");
    }
}

실행 결과: #🎜🎜 #

자바는 멀티스레드인가요?

Callable과 Future를 사용하여 스레드 만들기

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

자식 스레드의 반환 값을 얻을 수 없습니다

실행 메서드에서 예외를 던질 수 없습니다

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

실제로는 이전 방법보다 변환 과정이 하나 더 추가됩니다. 결국 Thread의 시작을 통해 새로운 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();
            }
        }
    }
}

실행 결과( 부분):

위 내용은 자바는 멀티스레드인가요?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

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