Java でスレッドを作成する 3 つの方法は次のとおりです: 1. Thread クラスを継承してスレッドを作成する; 2. Runnable インターフェイスを実装してスレッドを作成する; 3. Callable と Future を使用してスレッドを作成する。
Java は Thread クラスを使用してスレッドを表し、すべてのスレッド オブジェクトは Thread クラスまたはそのサブクラスのインスタンスである必要があります。 Java は、次の 3 つの方法でスレッドを作成できます。
1) Thread クラスを継承してスレッドを作成する
2) Runnable インターフェイスを実装するスレッドの作成
3) Callable と Future を使用してスレッドを作成します
スレッドを作成するこれら 3 つの方法をそれぞれ見てみましょう。
------------------------Thread クラスを継承してスレッドを作成します--- --- ---------------
Thread クラスを継承してマルチスレッドを作成および開始する一般的な手順は次のとおりです。 follow
1]D Thread クラスのサブクラスを定義し、クラスの run() メソッドをオーバーライドします。このメソッドのメソッド本体はタスクです。 run() メソッドはスレッド実行本体とも呼ばれます。
#2] Thread サブクラスのインスタンスを作成します。つまり、スレッド オブジェクトを作成します。
#3] スレッドを開始します。つまり、スレッド オブジェクトを作成します。 、スレッドの start()Method
コード例
public class MyThread extends Thread{//继承Thread类 public void run(){ //重写run方法 } } public class Main { public static void main(String[] args){ new MyThread().start();//创建并启动线程 } }
-----------を呼び出します。 ------ ------Runnable インターフェイスを実装してスレッドを作成する---------------------
Runnable を実装する インターフェイスを介してスレッドを作成および開始する一般的な手順は次のとおりです。
#1] Runnable インターフェイスの実装クラスを定義し、オーバーライドすることもできます。 run() メソッド。この run() メソッドは Thread の run() と同じです。) メソッドはスレッドの実行本体でもあります
#2] インスタンスを作成しますRunnable 実装クラスのインスタンスを作成し、このインスタンスを Thread のターゲットとして使用して Thread オブジェクトを作成します。この Thread オブジェクトは実際のスレッド オブジェクトです。
3]3 番目の部分はまだ開始します。スレッド オブジェクトの start() メソッドを呼び出してスレッドを実行します。
コード例:
public class MyThread2 implements Runnable {//实现Runnable接口 public void run(){ //重写run方法 } } public class Main { public static void main(String[] args){ //创建并启动线程 MyThread2 myThread=new MyThread2(); Thread thread=new Thread(myThread); thread().start(); //或者 new Thread(new MyThread2()).start(); } }
------------- -----------Callable と Future を使用してスレッドを作成します--------------- -------
は Runnable インターフェイスとは異なります。Callable インターフェイスは、スレッドの実行本体として call() メソッドを提供します。call() メソッドは run() メソッドです。 # 強力でなければなりません。
#>>call() メソッドは戻り値を持つことができます>>call() メソッドは次のことを宣言できます。例外をスローします
Java5 は、Callable インターフェースの call() メソッドの戻り値を表す Future インターフェースを提供し、Future インターフェースの実装クラス FutureTask を提供します。この実装クラスは、Future を実装するだけではありません。インターフェイスですが、Runnable インターフェイスも実装しているため、Thread クラスのターゲットとして使用できます。 Future インターフェイスには、関連する呼び出し可能なタスクを制御するために、いくつかのパブリック メソッドが定義されています。
>boolean cancel(boolean MayInterruptIfRunning): ビューは、Future に関連付けられた Callable タスクをキャンセルします。
>V get(): Callable の call() メソッドの戻り値を返します。このメソッドを呼び出すとプログラムがブロックされ、サブスレッドが終了するまで戻り値は取得されません。
>V get(long timeout, TimeUnit単位): の戻り値を返します。 Callable の call() メソッド。タイムアウト時間までブロックされ、指定された時間の後にリターンはスローされません。 TimeoutException
>boolean isDone(): Callable タスクが完了した場合、True
を返します。>boolean isCancelled(): Callable タスクが正常に完了する前にキャンセルされた場合、Cancel, return True
関連する概念を紹介した後、戻り値を持つスレッドを作成して開始する手順は次のとおりです。次のように:
1] Callable インターフェイスの実装クラスを作成し、 call () メソッドを実装してから、実装クラスのインスタンスを作成します (Java8 以降では、ラムダ式を直接使用してCallable オブジェクトを作成します)。#2] FutureTask クラスを使用して Callable オブジェクトをラップします。FutureTask オブジェクトは、Callable オブジェクトの call() メソッドの戻り値をカプセル化します。
#3 ]FutureTask オブジェクトを Thread オブジェクトのターゲットとして使用して、スレッドを作成して開始します (FutureTask は Runnable インターフェイスを実装しているため)#4] get( ) FutureTask オブジェクトのメソッドを呼び出して、サブスレッド実行後の結果を取得します。戻り値
コード例:
public class Main { public static void main(String[] args){ MyThread3 th=new MyThread3(); //使用Lambda表达式创建Callable对象 //使用FutureTask类来包装Callable对象 FutureTask<Integer> future=new FutureTask<Integer>( (Callable<Integer>)()->{ return 5; } ); new Thread(task,"有返回值的线程").start();//实质上还是以Callable对象来创建并启动线程 try{ System.out.println("子线程的返回值:"+future.get());//get()方法会阻塞,直到子线程执行结束才返回 }catch(Exception e){ ex.printStackTrace(); } } }
------ ---------- ------------------------3つのスレッド作成方法の比較------------- ---------- -------
Runnable インターフェイスと Callable インターフェイスの実装方法は基本的に同じですただし、後者はcall()メソッドの実行時に戻り値があり、後者はスレッド実行本体のrun()メソッドの戻り値に戻り値がないため、これら2つのメソッドは1つに分類できます。メソッドと Thread クラスを継承するメソッドは次のとおりです。
1、執行緒只是實作Runnable或實作Callable接口,還可以繼承其他類別。
2、這種方式下,多個執行緒可以共享一個target對象,非常適合多執行緒處理同一份資源的情況。
3、但是程式設計稍微複雜,如果需要存取當前線程,必須呼叫Thread.currentThread()方法。
4、繼承Thread類別的執行緒類別不能再繼承其他父類別(Java單繼承決定)。
註:一般推薦採用實作介面的方式來建立多執行緒
更多程式相關知識,請造訪:程式設計影片課程! !
以上がJavaでスレッドを作成する3つの方法は何ですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。