Javaでスレッドを作成するにはどのような方法がありますか? Java でスレッドを作成する 3 つの方法

不言
リリース: 2018-09-25 15:49:14
オリジナル
4227 人が閲覧しました

この記事でわかることは、Java でスレッドを作成するにはどのような方法があるのか​​ということです。 Java でスレッドを作成する 3 つの方法は、必要な場合に参考にしていただければ幸いです。

1. 継承 Thread クラスの作成

Thread を継承して run() を書き換えることで、スレッドは run メソッドでタスクを実行します。作成されたサブクラスは、start() メソッドを呼び出すことでスレッド メソッドを実行できます。

Thread で実装されたスレッドクラスを継承することにより、スレッドクラスのインスタンス変数を複数のスレッド間で共有することができなくなります。 (当然共有されない、別の Thread オブジェクトを作成する必要があります)

例:

/**
 * 通过继承Thread实现线程
 */
public class ThreadTest extends Thread{
  
  private int i = 0 ;

    @Override
    public void run() {
        for(;i<50;i++){
            System.out.println(Thread.currentThread().getName() + " is running " + i );
        }
    }

    public static void main(String[] args) {
        for(int j=0;j<50;j++){if(j=20){
                new ThreadTest().start() ;
                new ThreadTest().start() ;
            }
        }
    }
}
ログイン後にコピー

2 を通じてスレッド クラスを作成します。 Runnable インターフェイス

このメソッドは、最初に Runnable インターフェイスを実装するクラスを定義し、インターフェイスの run() メソッドを書き換える必要があります。この run メソッドはスレッドの実行本体です。次に、Thread オブジェクトを作成するためのパラメータ ターゲットとして、Runnable 実装クラスのオブジェクトを作成します。この Thread オブジェクトは、実際のスレッド オブジェクトです。 Runnable インターフェイスを実装するスレッド クラスは、相互にリソースを共有します。

/**
 * 通过实现Runnable接口实现的线程类
 */
public class RunnableTest implements Runnable {
    private int i ;
    @Override
    public void run() {
        for(;i<50;i++){
            System.out.println(Thread.currentThread().getName() + " -- " + i);
        }
    }
    public static void main(String[] args) {
        for(int i=0;i<100;i++){
            System.out.println(Thread.currentThread().getName() + " -- " + i);
            if(i==20){
                RunnableTest runnableTest = new RunnableTest() ;
                new Thread(runnableTest,"线程1").start() ;
                new Thread(runnableTest,"线程2").start() ;
            }
        }
    }
}
ログイン後にコピー

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

Thread クラスの継承と Runnable の実装からわかります。これらのメソッドはいずれも戻り値を持つことができず、例外をスローするように宣言することもできません。 Callable インターフェイスは、これら 2 つの点を実現します。Callable インターフェイスは、Runable インターフェイスのアップグレード版のようなもので、スレッドの実行本体として機能し、戻り値を許可します。

ただし、Callable インターフェイスは Java 5 の新しいインターフェイスであり、Runnable インターフェイスのサブインターフェイスではないため、Callable オブジェクトを Thread オブジェクトのターゲットとして直接使用することはできません。この問題の解決策は、call() の戻り値を受け入れることができる Future インターフェイスを導入することです。Future インターフェイスは、Runnable インターフェイスのサブインターフェイスであり、Thread オブジェクトのターゲットとして使用できます。さらに、Future インターフェイスは実装クラス FutureTask を提供します。

FutureTask は Future インターフェイスと Runnable インターフェイスを実装しており、Thread オブジェクトのターゲットとして使用できます。

関係は次のとおりです。

例:

import java.util.concurrent.Callable;
import java.util.concurrent.FutureTask;
public class CallableTest {
    public static void main(String[] args) {
        CallableTest callableTest = new CallableTest() ;
        //因为Callable接口是函数式接口,可以使用Lambda表达式
        FutureTask<Integer> task = new FutureTask<Integer>((Callable<Integer>)()->{
           int i = 0 ;
           for(;i<100;i++){
               System.out.println(Thread.currentThread().getName() + "的循环变量i的值 :" + i);
           }
           return i;
        });
       for(int i=0;i<100;i++){
           System.out.println(Thread.currentThread().getName()+" 的循环变量i : + i");
           if(i==20){
               new Thread(task,"有返回值的线程").start();
           }
       }
       try{
           System.out.println("子线程返回值 : " + task.get());
        }catch (Exception e){
           e.printStackTrace();
        }
    }
}
ログイン後にコピー

概要

上記の 3 つの方法は、実際にはクラスの継承とインターフェイスの実装の 2 つのカテゴリに分類できます。継承と比較して、インターフェイスの実装はより柔軟であり、Java の単一継承メカニズムによって制限されません。また、インターフェイスを実装することでリソースを共有できるため、同じリソースをマルチスレッドで処理するのに適しています。スレッドの知識は豊富かつ複雑であるため、より詳細を学習して習得する必要があります。

以上がJavaでスレッドを作成するにはどのような方法がありますか? Java でスレッドを作成する 3 つの方法の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

関連ラベル:
ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
最新の問題
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート