JAVA——マルチスレッドを実現
Java仮想マシンはアプリケーションが同時に複数のスレッドを実行することを許可し、マルチスレッドの実現には一般的に3つの方式がある:1、Threadクラスを継承し、run()メソッドを書き換える
スレッドを起動する唯一の方法はThreadクラスのstart()方式です.注意:start()を呼び出す方法は、直ちにマルチスレッドコードを実行するのではなく、そのスレッドを実行可能状態にし、実行時間はシステムによって決定されます.
2.Runnableインタフェースを実現し、そのインタフェースを実現するrun()方法
Threadクラスを継承してもRunnableインタフェースを使用しても、最終的にはThreadのオブジェクトのAPIによってスレッドを制御します.
別の形式(匿名の内部クラス、比較的一般的):
3、Callableインタフェースを実現し、Callメソッドを書き換えるCallableインタフェースはRunnableインタフェースの機能と似ているが、Runnableよりも強い違いがある:1、Callableはタスク終了後に戻り値を提供し、Runnableはこの機能を提供できない2、Callableのcall()メソッドは異常を投げ出すことができ、Runnableのrun()メソッド不可3、Callableを実行すると、非同期計算の結果を示すFutureオブジェクトが得られ、計算が完了したかどうかを確認する方法が提供されます.Futureを使用してターゲットスレッド呼び出しcall()メソッドの場合を監視し、Futureのget()メソッドを呼び出して結果を取得し、call()メソッドが結果を返すまで現在のスレッドがブロックされます.
マルチスレッドを実装する必要がある場合はRunnableインタフェースを実装する方法を推奨します.
class MyThread extends Thread {
@Override
public void run() {
//
}
}
---------------------------------------------
// :
MyThread thread=new MyThread();
thread.start();
スレッドを起動する唯一の方法はThreadクラスのstart()方式です.注意:start()を呼び出す方法は、直ちにマルチスレッドコードを実行するのではなく、そのスレッドを実行可能状態にし、実行時間はシステムによって決定されます.
2.Runnableインタフェースを実現し、そのインタフェースを実現するrun()方法
class MyThread implements Runnable {
@Override
public void run() {
//
}
}
-------------------------------------------
//
MyThread thread=new MyThread();
Thread t=new Thread(thread);
t.start;
Threadクラスを継承してもRunnableインタフェースを使用しても、最終的にはThreadのオブジェクトのAPIによってスレッドを制御します.
別の形式(匿名の内部クラス、比較的一般的):
new Thread(new Runnable() {
@Override
public void run() {
//
}
}).start();
3、Callableインタフェースを実現し、Callメソッドを書き換えるCallableインタフェースはRunnableインタフェースの機能と似ているが、Runnableよりも強い違いがある:1、Callableはタスク終了後に戻り値を提供し、Runnableはこの機能を提供できない2、Callableのcall()メソッドは異常を投げ出すことができ、Runnableのrun()メソッド不可3、Callableを実行すると、非同期計算の結果を示すFutureオブジェクトが得られ、計算が完了したかどうかを確認する方法が提供されます.Futureを使用してターゲットスレッド呼び出しcall()メソッドの場合を監視し、Futureのget()メソッドを呼び出して結果を取得し、call()メソッドが結果を返すまで現在のスレッドがブロックされます.
public class CallableTest implements Callable<String>{
public String call()throws Exception{
//
return null;
}
}
----------------------------------------------------------------------
//
ExecutorService threadPool=Executors.newSingleThreadExecutor();
Future<String> future=threadPool.submit(new CallableTest());
try{
future.get();// ,
}catch(Exception e){
e.printStackTrace();
}
マルチスレッドを実装する必要がある場合はRunnableインタフェースを実装する方法を推奨します.