ホームページ  >  記事  >  Java  >  Javaはマルチスレッドですか?

Javaはマルチスレッドですか?

(*-*)浩
(*-*)浩オリジナル
2019-11-09 13:44:393285ブラウズ

Java はマルチスレッドです。マルチスレッドを使用するには、Thread クラスの継承、Runnable インターフェイスの実装、Callable と Future を使用したスレッドの作成の 3 つの方法があります。

Javaはマルチスレッドですか?

Thread クラスの継承 (推奨学習: Java コース )

実装方法は非常に簡単で、Threadクラスを継承するクラスを作成し、runメソッドを書き換えるだけで、mainメソッド内でクラスインスタンスオブジェクトの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はマルチスレッドですか?

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はマルチスレッドですか?

Callable と Future を使用してスレッドを作成する

上記の 2 つのメソッドには次の 2 つの問題があります:

子スレッドの戻り値を取得できません

run メソッドは例外をスローできません

#これら 2 つの問題を解決するには、Callable インターフェイスを使用する必要があります。インターフェースに関して言えば、上記の Runnable インターフェース実装クラスのインスタンスが Thread クラスのコンストラクターのパラメーターとして渡され、Thread の起動を通じて run メソッドの内容が実行されます。ただし、Callable は Runnable のサブインターフェイスではなく、まったく新しいインターフェイスであり、そのインスタンスを Thread 構造に直接渡すことはできないため、変換するには別のインターフェイスが必要です。

実際には変換処理が 1 つ多く、最終的に 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はマルチスレッドですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。