ホームページ  >  記事  >  Java  >  Javaでマルチスレッドを実装するいくつかの方法

Javaでマルチスレッドを実装するいくつかの方法

王林
王林オリジナル
2019-12-04 16:42:034809ブラウズ

Javaでマルチスレッドを実装するいくつかの方法

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

1. Thread クラスの継承

実装は非常に簡単で、Thread クラスを継承するクラスを作成するだけです。 run メソッドをオーバーライドします。メイン メソッドでこのクラスのインスタンス オブジェクトの 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 学習ビデオ

ここで注意すべきもう 1 つの点は、myThread の start メソッドは run() ではなく main メソッドで呼び出される必要があることです。方法。 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でマルチスレッドを実装するいくつかの方法

実行結果については何も言うことはありません。ここの main で確認できます。実際に新しいスレッドを作成するときは、やはり Thread を通じて作成されます。

Thread thread = new Thread(runnable);

このステップにおける Thread クラスの機能は、 run() メソッドをパッケージ化することです。スレッド実行本体を作成し、さらに start を使用して、スレッドをスケジュールする準備ができていることをシステムに伝えます。

3. Callable と Future を使用してスレッドを作成します

上記 2 つの方法には次の 2 つの問題があります:

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

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

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

Java5では、Callableインタフェースのcall()メソッドの戻り値を表現するFutureインタフェースと、Futureインタフェースの実装クラスFutureTaskを提供しており、実装クラスの継承関係は以下のとおりです。図:

Javaでマルチスレッドを実装するいくつかの方法

ご覧のとおり、この実装クラスは Future インターフェイスを実装するだけでなく、Runnable インターフェイスも実装しているため、Thread コンストラクターに直接渡すことができます。

FutureTask のコンストラクターは次のとおりです:

つまり、実際には変換処理が 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でマルチスレッドを実装するいくつかの方法

# 関連するおすすめ記事チュートリアル:

Java 入門プログラム

以上がJavaでマルチスレッドを実装するいくつかの方法の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

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