>  기사  >  Java  >  Java에서 멀티스레딩을 만드는 방법은 무엇입니까? (상세한)

Java에서 멀티스레딩을 만드는 방법은 무엇입니까? (상세한)

不言
不言원래의
2018-09-25 15:32:011617검색

이 기사의 내용은 Java에서 멀티스레딩을 만드는 방법에 관한 것입니다. (자세한 내용) 도움이 필요한 친구들이 참고하시면 좋을 것 같습니다.

스레드란 무엇입니까?

스레드는 프로세스의 개체이며 시스템에 의해 독립적으로 예약되고 전달되는 기본 단위입니다. 스레드 자체는 시스템 리소스를 소유하지 않으며 작업에 필수적인 일부 리소스만 소유합니다. , 그러나 해당 프로세스가 소유한 모든 리소스를 동일한 프로세스에 속한 다른 스레드와 공유할 수 있습니다

표면적으로는 멀티스레딩이지만 실제로는 CPU가 빠르게 교대로 실행합니다

멀티스레딩( 병렬 및 동시)

  1. 병렬: 두 작업이 함께 작동합니다. 진행은 작업 A가 실행되는 동안 작업 B도 실행된다는 의미입니다(여러 코어 필요)

  2. 동시성: 두 작업 모두 실행하도록 요청되며 프로세서는 하나의 작업만 수락하므로 두 작업이 차례로 실행되도록 배열됩니다. 시간 간격이 매우 짧기 때문에 두 작업이 모두 실행되는 느낌을 줍니다

멀티 스레딩(Java 프로그램 실행 원리)

java 명령은 jvm을 시작하며 이는 응용 프로그램을 시작하는 것과 같습니다( 프로세스). 프로세스는 자동으로 "메인 스레드"를 시작하고 메인 스레드는 메인 메소드를 호출합니다

jvm을 단일 스레드로 시작합니까?

아니요, 멀티스레드입니다. 적어도 가비지 수집 스레드와 메인 스레드는 시작됩니다

다음 코드로 확인할 수 있습니다. 메인 스레드와 가비지 수집 스레드가 서로 리소스를 두고 경쟁하고 있습니다

public class TestThread {

    public static void main(String[] args) {
        //4.创建Thread的子类对象
        MyThread myThread = new MyThread();

        //5.启动线程,注意这里使用的是start而不是run方法
        myThread.start();

        for (int i = 0; i < 10000; i ++) {
            System.out.println("This is main thread");
        }
    }


}

//1.继承Thread
class MyThread extends  Thread{

    //2.重写run方法
    @Override
    public void run() {
        super.run();
        //3.线程方法中要执行的代码,可以根据自己的需求填写
        for(int i = 0 ; i < 10000 ; i ++ ) {
            System.out.println("This is MyThread thread ");
        }
    }
}

멀티 스레드를 생성하는 방법 java

(1) Thread 클래스 상속 및 시작 메소드 호출

Thread는 Runnable 인터페이스를 구현합니다.
멀티 스레딩을 구현하려면 스레드의 하위 클래스가 되어 run 메소드를 재정의해야 합니다. 스레드를 시작할 때 호출되는 것은 run 메서드가 아니라 start 메서드라는 점에 유의하세요. run 메소드를 호출하면 스레드를 열지 않는 일반 메소드와 동일합니다

public class Thread implements Runnable
public class TestThread {

    public static void main(String[] args) {
        MyThread myThread = new MyThread();
        //注意这里使用的是start而不是run方法
        myThread.start();

        for (int i = 0; i < 10000; i ++) {
            System.out.println("This is main thread");
        }
    }
}
class MyThread extends  Thread{
    @Override
    public void run() {
        super.run();

        for(int i = 0 ; i < 10000 ; i ++ ) {
            System.out.println("This is MyThread thread ");
        }
    }
}

(2) Runnable 인터페이스를 구현하고 실행 메소드를 다시 작성합니다

Runnable에는 run() 메소드가 하나만 있으며, 스레드 시작 메소드가 Thread에 존재합니다.
그런 다음 마침내 스레드를 시작할 때 Thread의 하위 클래스 객체를 통해 스레드를 시작해야 합니다

public class TestRunnable {

    public static void main(String[] args) {
        //4.创建Thread的子类对象
        Runnable myRunnable = new MyRunnable();

        //5.启动线程,创建Thread并把runnable的子类作为构造参数
        new Thread(myRunnable).start();

        for (int i = 0; i < 10000; i ++) {
            System.out.println("This is main thread");
        }
    }

}
//1.实现runnable接口
class MyRunnable implements Runnable {

    //2.重写run方法
    @Override
    public void run() {
        //3.线程方法中要执行的代码,可以根据自己的需求填写
        for(int i = 0 ; i < 10000 ; i ++ ) {
            System.out.println("This is MyRunnable thread ");
        }
    }
}

Callable 인터페이스를 구현합니다

스레드를 구현하려면 스레드와 실행 가능 항목을 상속하는 것 외에도 Callable 인터페이스를 구현할 수도 있습니다. Callable 인터페이스는 run()과 동일한 기능을 갖는 스레드 실행 본문으로 사용할 수 있는 call() 메소드를 제공합니다. 하지만 call() 메서드는 run() 메서드보다 반환값이 더 많고, call() 메서드는 throw된 예외를 선언할 수 있습니다. 그러면 Callable 스레드를 어떻게 시작합니까? Callable 인터페이스는 Runnable 인터페이스의 하위 인터페이스가 아니기 때문에 Callable 객체를 Thread의 구성 매개변수로 사용할 수 없습니다. Java는 Runnable을 구현하는 또 다른 인터페이스인 RunnableFuture 인터페이스를 제공하고, Future

  1. Callable 인터페이스

  2. 를 구현하여 스레드의 run 메소드와 동일한 call 메소드를 재정의합니다. 차이점은 call 메소드가 반환 값을 허용한다는 것입니다.

  3. Callable 구현 클래스 객체를 FutureTask에 생성 매개변수로 전달하여 FutureTask 객체를 생성합니다.

  4. FutureTask 객체를 Thread에 구성 매개변수로 전달하고 스레드를 시작합니다.

public class CallableDemo {

    public static void main(String[] args) {
        //3.把Callable实现类对象作为构造参数传入FutureTask创建FutureTask对象。
        FutureTask<UUID> futureTask = new FutureTask<UUID>(new MyCallable());
        //4.把FutureTask对象作为构造参数传入Thread,并开启线程
        new Thread(futureTask).start();
        try {
            System.out.println(futureTask.get());
        } catch (InterruptedException e) {
            e.printStackTrace();
        } catch (ExecutionException e) {
            e.printStackTrace();
        }
    }
}

//1. 实现**Callable**接口
class MyCallable implements Callable<UUID> {

    //2.重写**call**方法,相当于thread中的run方法。不同的是call方法允许有返回值
    @Override
    public UUID call() throws Exception {
        //生成随机数
        return UUID.randomUUID();
    }
}

Thread를 상속하여 Runnable과 Callable의 차이를 실현합니다.

소스 코드 구현에서

Thread 상속

하위 클래스가 Thread를 다시 작성합니다. run() 메서드에서 start() 메서드를 호출하면 jvm은 자동으로 하위 클래스

implement Runnable

new Thread(myRunnable)의 run()을 호출하고 Thread 생성자에 runnable 참조를 입력한 다음 전달합니다. 스레드 변수 대상의 멤버에게 전달됩니다. Thread run() 메서드에서는 대상이 비어 ​​있지 않으면 하위 클래스의 run 메서드가 호출된다고 판단합니다

    public void run() {
    if (this.target != null) {
        this.target.run();
    }

Callable 인터페이스를 구현합니다

Callable 인터페이스를 구현하여 Call() 메서드를 재정의하고, 스레드 반환 값을 제공하거나 예외가 발생했습니다. 마지막으로 Runnable의 하위 인터페이스 RunnableFuture의 구현 클래스 FutureTask를 통해 Thread의 멤버 변수 대상으로 전달됩니다.

사용 및 확장 측면에서

Inherit Thread

  1. 장점: 스레드에서 start() 메서드를 직접 호출, 매우 간단함

  2. 단점: Java는 단일 상속만 지원하므로 스레드를 상속할 수 없습니다. 더 이상 사용할 수 없습니다.

    장점: Java는 다중 구현 가능, 예외 발생 가능, 반환 값 반환 가능

단점: 코드 작성이 더 복잡함

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

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