戻り値を取得できるスレッド
89687 ワード
マルチスレッドプログラムを作成するのは、マルチタスクの同時実行を実現し、ユーザーとよりよく対話できるようにするためです.3つの方法があります
RunnableとCallableの違いは,(1)Callableで規定する方法はcall()であり,Runnableで規定する方法はrun()である.(2)Callableのタスクは実行後に値を返すことができ,Runnableのタスクは値を返すことができない(3)callメソッドは異常を投げ出すことができ,runメソッドは(4)Callableタスクを実行してFutureオブジェクトを得ることができ,非同期計算の結果を表す.計算が完了するかどうかを確認する方法を提供し、計算の完了を待機し、計算の結果を取得します.Futureオブジェクトでは、タスクの実行状況を把握したり、タスクの実行をキャンセルしたり、実行結果を取得したりできます.
1.Runnableインタフェースを実現してThreadスレッドを作成する:
手順1:Runnableインタフェースを実装するクラスを作成します.
class SomeRunnable implements Runnable { public void run() { //do something here } }
手順2:クラスオブジェクトを作成します.
Runnable oneRunnable = new SomeRunnable();
手順3:RunnableによってThreadオブジェクトを作成します.
Thread oneThread = new Thread(oneRunnable);
手順4:スレッドの開始:
oneThread.start();
これで、スレッドの作成が完了しました.
注記:スレッドの実行プロセスは、コードoneThreadを実行するときに簡単です.start();を選択すると、oneRunnableオブジェクトのvoid run()が実行されます.方法、
このメソッドの実行が完了すると、スレッドは消滅します.
2、方法1と同様に、Callableインタフェースを実現することによってThreadスレッドを作成する:ここで、Callableインタフェース(一つの方法しかない)は以下のように定義する:
public interface Callable { V call() throws Exception;}手順1:Callableインタフェースを実装するクラスSomeCallable(略);
手順2:クラスオブジェクトを作成します.
Callable oneCallable = new SomeCallable();
手順3:CallableからFutureTaskオブジェクトを作成します.
FutureTask oneTask = new FutureTask(oneCallable);
注記:FutureTaskは、Callableを受け入れることで作成されたパッケージで、FutureとRunnableインタフェースを同時に実現します.手順4:FutureTaskからThreadオブジェクトを作成します.
Thread oneThread = new Thread(oneTask);
手順5:スレッドの開始:
oneThread.start();
これで、スレッドの作成が完了しました.
3.Threadクラスを継承してスレッドを作成する.
ステップ1:Threadクラスを継承するサブクラスを定義します.
class SomeThead extends Thraad { public void run() { //do something here } }
手順2:サブクラスのオブジェクトを作成します.
SomeThread oneThread = new SomeThread();
手順3:スレッドの開始:
oneThread.start();
これで、スレッドの作成が完了しました.
注記:このスレッドの作成方法は、主に実行メカニズムの問題に関連し、プログラムのパフォーマンスに影響を与えるため、十分ではありません.
4、スレッドプールを通してスレッドを作成する:
手順1:スレッドプールの作成:
ExecutorService pool = Executors.newCachedThreadPool();
手順2:RunnableオブジェクトまたはCallableオブジェクトを使用して、ExecutorServiceオブジェクトにタスクをコミットします.
Future submit(Callable task);
注記:Futureは次のように定義されたインタフェースです.
public interface Future { V get() throws ...; V get(long timeout, TimeUnit unit) throws ...; void cancle(boolean mayInterrupt); boolean isCancelled(); boolean isDone(); }
これで、スレッドの作成が完了しました.
注記:スレッドプールはshutdown()を呼び出す必要があります.スレッドを閉じます.
5、イベント割当スレッドによって、プログラム内の既存のスレッドを直接使用する:
使用方法:EventQueueクラスの静的メソッドinvokeLater()を直接呼び出します.
EventQueue.invokeLater(oneRunnable);
注記:EventQueueを呼び出します.invokeLater(oneRunnable);oneRunnableオブジェクトのrun()メソッドが直接実行されます
Runnbaleは非同期で実行されるタスクをカプセル化し,パラメータと戻り値のない非同期メソッドとして想像できる.CallableはRunnableと似ていますが、戻り値があります.Callableインタフェースはパラメータ化されたタイプで、1つの方法しかありませんcall
public interface Callable {
V call() throws Exception;
}
タイプパラメータは、戻り値のタイプです.たとえば、Callableは、最終的にStringを返す非同期操作(計算)を表します.
Runnbaleは非同期で実行されるタスクをカプセル化し,パラメータと戻り値のない非同期メソッドとして想像できる.CallableはRunnableと似ていますが、戻り値があります.Callableインタフェースはパラメトリックタイプで、一つの方法call()しかありません.
public interface Callable {
V call() throws Exception;
}
タイプパラメータは、戻り値のタイプです.たとえば、Callableは、最終的にStringを返す非同期操作(計算)を表します.
RunnableとCallableの違いは,(1)Callableで規定する方法はcall()であり,Runnableで規定する方法はrun()である.(2)Callableのタスクは実行後に値を返すことができ,Runnableのタスクは値を返すことができない(3)callメソッドは異常を投げ出すことができ,runメソッドは(4)Callableタスクを実行してFutureオブジェクトを得ることができ,非同期計算の結果を表す.計算が完了するかどうかを確認する方法を提供し、計算の完了を待機し、計算の結果を取得します.Futureオブジェクトでは、タスクの実行状況を把握したり、タスクの実行をキャンセルしたり、実行結果を取得したりできます.
1.Runnableインタフェースを実現してThreadスレッドを作成する:
手順1:Runnableインタフェースを実装するクラスを作成します.
class SomeRunnable implements Runnable { public void run() { //do something here } }
手順2:クラスオブジェクトを作成します.
Runnable oneRunnable = new SomeRunnable();
手順3:RunnableによってThreadオブジェクトを作成します.
Thread oneThread = new Thread(oneRunnable);
手順4:スレッドの開始:
oneThread.start();
これで、スレッドの作成が完了しました.
注記:スレッドの実行プロセスは、コードoneThreadを実行するときに簡単です.start();を選択すると、oneRunnableオブジェクトのvoid run()が実行されます.方法、
このメソッドの実行が完了すると、スレッドは消滅します.
2、方法1と同様に、Callableインタフェースを実現することによってThreadスレッドを作成する:ここで、Callableインタフェース(一つの方法しかない)は以下のように定義する:
public interface Callable
手順2:クラスオブジェクトを作成します.
Callable
手順3:Callable
FutureTask
注記:FutureTask
Thread oneThread = new Thread(oneTask);
手順5:スレッドの開始:
oneThread.start();
これで、スレッドの作成が完了しました.
3.Threadクラスを継承してスレッドを作成する.
ステップ1:Threadクラスを継承するサブクラスを定義します.
class SomeThead extends Thraad { public void run() { //do something here } }
手順2:サブクラスのオブジェクトを作成します.
SomeThread oneThread = new SomeThread();
手順3:スレッドの開始:
oneThread.start();
これで、スレッドの作成が完了しました.
注記:このスレッドの作成方法は、主に実行メカニズムの問題に関連し、プログラムのパフォーマンスに影響を与えるため、十分ではありません.
4、スレッドプールを通してスレッドを作成する:
手順1:スレッドプールの作成:
ExecutorService pool = Executors.newCachedThreadPool();
手順2:RunnableオブジェクトまたはCallableオブジェクトを使用して、ExecutorServiceオブジェクトにタスクをコミットします.
Future
注記:Futureは次のように定義されたインタフェースです.
public interface Future
これで、スレッドの作成が完了しました.
注記:スレッドプールはshutdown()を呼び出す必要があります.スレッドを閉じます.
5、イベント割当スレッドによって、プログラム内の既存のスレッドを直接使用する:
使用方法:EventQueueクラスの静的メソッドinvokeLater()を直接呼び出します.
EventQueue.invokeLater(oneRunnable);
注記:EventQueueを呼び出します.invokeLater(oneRunnable);oneRunnableオブジェクトのrun()メソッドが直接実行されます
Runnbaleは非同期で実行されるタスクをカプセル化し,パラメータと戻り値のない非同期メソッドとして想像できる.CallableはRunnableと似ていますが、戻り値があります.Callableインタフェースはパラメータ化されたタイプで、1つの方法しかありませんcall
public interface Callable
V call() throws Exception;
}
タイプパラメータは、戻り値のタイプです.たとえば、Callable
Runnbaleは非同期で実行されるタスクをカプセル化し,パラメータと戻り値のない非同期メソッドとして想像できる.CallableはRunnableと似ていますが、戻り値があります.Callableインタフェースはパラメトリックタイプで、一つの方法call()しかありません.
public interface Callable
V call() throws Exception;
}
タイプパラメータは、戻り値のタイプです.たとえば、Callable
- //
- class PrimeCallable implements Callable<int[]> {
- private int max;
-
- public PrimeCallable(int max) {
- this.max = max;
- }
-
- @Override
- public int[] call() throws Exception {
- List<Integer> result = new ArrayList<Integer>();
- for(int i = 2; i <= max; i++) {
- System.out.println("System is checking data " + i);
- if(isPrime(i)) {
- result.add(i);
- }
- }
-
- Integer[] iters = result.toArray(new Integer[]{});
- int[] array = new int[iters.length];
- int i = 0;
- for(Integer iter : iters) {
- array[i++] = iter;
- }
- return array;
- }
-
- private boolean isPrime(int data) {
- try {
- Thread.sleep(5);
- } catch (InterruptedException e) {
- e.printStackTrace();
- }
- for(int i = 2; i < ((int)Math.sqrt(data)+1); i++) {
- if(data % i == 0)
- return false;
- }
- return true;
- }
- }
- Callable<int[]> primeCallable = new PrimeCallable(1000);
- FutureTask<int[]> ftask = new FutureTask<int[]>(primeCallable);
-
- Thread t = new Thread(ftask);
- t.start();
-
- int[] result = null;
- System.out.println("Waiting for result.....");
- try {
- result = ftask.get();
- } catch (InterruptedException e) {
- e.printStackTrace();
- } catch (ExecutionException e) {
- e.printStackTrace();
- }
-
- for(int i = 0; result != null && i < result.length; i++) {
- if(i != 0 && i % 10 == 0) {
- System.out.println();
- }
- System.out.print(String.format("%1$-5s", result[i]));
- }
- :
- Waiting for result.....
- System is checking data 2
- System is checking data 3
- System is checking data 4
- System is checking data 5
- System is checking data 6
- System is checking data 7
- ..................................
- System is checking data 999
- System is checking data 1000
- 2 3 5 7 11 13 17 19 23 29
- 31 37 41 43 47 53 59 61 67 71
- 73 79 83 89 97 101 103 107 109 113
- 127 131 137 139 149 151 157 163 167 173
- 179 181 191 193 197 199 211 223 227 229
- 233 239 241 251 257 263 269 271 277 281
- 283 293 307 311 313 317 331 337 347 349
- 353 359 367 373 379 383 389 397 401 409
- 419 421 431 433 439 443 449 457 461 463
- 467 479 487 491 499 503 509 521 523 541
- 547 557 563 569 571 577 587 593 599 601
- 607 613 617 619 631 641 643 647 653 659
- 661 673 677 683 691 701 709 719 727 733
- 739 743 751 757 761 769 773 787 797 809
- 811 821 823 827 829 839 853 857 859 863
- 877 881 883 887 907 911 919 929 937 941
- 947 953 967 971 977 983 991 997