コードコピーは次のとおりです。
パッケージcom.yao;
java.util.concurrent.callableをインポートします。
java.util.concurrent.executionexceptionをインポートします。
java.util.concurrent.executorserviceをインポートします。
java.util.concurrent.executorsをインポートします。
java.util.concurrent.futureをインポートします。
java.util.concurrent.scheduledexecutorserviceをインポートします。
java.util.concurrent.timeunitをインポートします。
/**
*新しいタスク実行アーキテクチャ。
* Java 5.0の前に、スレッドクラスのstart()メソッドを呼び出すことによりタスクが開始されました。
*タスクの提出と実行は同時に実行されます。
*または同時に実行されるスレッドの数を制御するには、完了するために追加のコードが必要です。
* 5.0は、タスクの実行を簡単にスケジュールして制御できる新しいタスク実行アーキテクチャを提供します。
*また、データベース接続プールに似たスレッドプールを確立して、タスクを実行できます。
*このアーキテクチャは、主に3つのインターフェイスと対応する特定のクラスで構成されています。
*これらの3つのインターフェイスは、executor、Executorservice、およびScheduleDexecutorserviceです。
*(1)executorインターフェイス:実行可能なタスクを実行するために使用されます。1つの方法のみを定義します。
*実行(runnableコマンド):実行可能なタイプのタスクを実行します
*(2)executorservice:executorメソッドを継承し、呼び出し可能なタスクを実行してタスクの実行を中止するサービスを提供します。
*その定義の主な方法は次のとおりです。
*送信(タスク):通話可能または実行可能なタスクを送信し、このタスクを表す将来のオブジェクトを返すために使用できます
* Invokeall(タスクのコレクション):タスクのバッチコレクションと、これらのタスクを表す将来のオブジェクトのコレクションを返します。
* Shutdown():提出されたタスクを完了した後、サービスを閉じますが、新しいタスクを受け入れなくなります。
* ShutdownNow():すべての実行タスクを停止し、サービスを閉じます。
* iSterminated():すべてのタスクが実行されているかどうかをテストします。
* isshutdown():executorserviceが閉じられているかどうかをテストします
*(3)ScheduleDexecutorService:Executorserviceを継承し、Timeに応じてタスクをスケジューリングする機能を提供します。
*スケジュール(タスク、initdelay):initdelayが指定した時間の後に実行される送信可能または実行可能なタスクをスケジュールします。
* Scheduleatfixedrate():指定された間隔で繰り返し実行される送信された実行可能なタスクをスケジュールします。
* schedulewithfixeddelay():実行されるたびに実行される送信された実行可能なタスクをスケジュールするたびに、遅延で指定された時間を待ちます。
*
* executorsクラスを通じてさまざまなサービスオブジェクトを取得します。
* Callable(実行可能タスク):実行可能なタスクを呼び出し可能なタスクに変換します
* NewsIngLethReadExecutor:ExecutorServiceオブジェクトを生成します。これには、タスクを実行するために使用できるスレッドが1つだけあります。
* NewCachedThreadPool():スレッドプールのサイズが必要に応じて調整されます。
* NewFixedThreadPool(int poolsize):executorserviceオブジェクトを生成します。これには、タスクの数がプールサイズよりも大きい場合、タスクが順番に実行されます。
* NewsIngLethReadScheduledExecutor:スケジュールexexecutorServiceオブジェクトを生成します。このオブジェクトのスレッドプールサイズは1です。複数のタスクがある場合、タスクは順番に実行されます。
* NewsCheduledThreadPool(int poolsize):スケジュールexecutorserviceオブジェクトを生成すると、このオブジェクトのスレッドプールサイズはプールサイズよりも大きい場合、タスクはキューで実行されます。
*/
パブリッククラスのexecutearch {
/**
*このスレッドは文字列を出力します
*/
public static class mythReadは実行可能{
public void run(){
System.out.println( "タスクリピート。" + System.CurrentTimeMillis());
試す {
thread.sleep(1000);
} catch(arternedexception e){
System.out.println( "タスクが中断されました。"
+ system.currenttimemillis());
}
}
}
/**
*呼び出し可能なものは別のタスクを終了します
*/
public static class mycallable Callable {
プライベートな未来の未来。
パブリックマイケーラブル(将来の将来){
this.future = future;
}
public string call(){
System.out.println(「タスクをキャンセルする...」
+ + system.currenttimemillis());
this.future.cancel(true);
「キャンセルされたタスク!」を返します。
}
}
/**
* @param args
* @Throws executionException
* @throws arturnedexception
*/
public static void main(string [] args)が中断されたエクセプトをスローします。
executionException {
//スレッドプールを備えたexecutorserviceオブジェクトを生成すると、スレッドプールのサイズが必要に応じて調整されます。
//スレッドがタスクを実行すると、次のタスクが使用されるようにスレッドプールに戻ります。
executorservice cachedService = executors.newcachedthreadpool();
将来のmythreadfuture = cachedservice.submit(new mythread());
Future MyCallableFuture = cachedService.submit(新しいmycallable(
mythreadfuture));
System.out.println(myCallableFuture.get());
System.out.println( "-----------------");
//実行可能なタスクを呼び出し可能なタスクに変換します
callable mythreadcallable = executors.callable(new mythread());
将来のmythreadcallablefuture = cachedservice.submit(mythreadcallable);
//実行可能なタスクの場合、呼び出し可能なタスクに変換された後、値は返されません
system.out.println(mythreadcallablefuture.get());
cachedservice.shutdownnow();
System.out.println( "-----------------");
// executorserviceオブジェクトを生成します。これには、サイズのプールサイズのスレッドプールがあります。
//タスクの数がプールサイズよりも大きい場合、タスクは順番にキューで実行されます
executorservice sixedservice = executors.newfixedthreadpool(2);
fixedservice.submit(new mythread());
fixedservice.submit(new mythread());
//スレッドプールサイズは2であるため、後続のタスクは、実行する前に以前のタスクを実行するのを待つ必要があります。
mythreadfuture = fixedservice.submit(new mythread());
myCallableFuture = fixedservice.submit(new mycallable(mythreadfuture));
System.out.println(myCallableFuture.get());
fixedservice.shutdownnow();
System.out.println( "-----------------");
// ScheduleDexecutorServiceオブジェクトを生成すると、このオブジェクトのスレッドプールサイズはプールサイズです。
//タスクの数がプールサイズよりも大きい場合、タスクはキューでの実行を待ちます
ScheduleDexecutorService sixedscheduledservice = executors
.newscheduledthreadpool(2);
//新しいタスクを作成1
mythread task1 = new mythread();
//タスク実行サービスを使用してタスク1をすぐに実行し、その後2秒ごとにタスク1を実行します。
mythreadfuture = fixedscheduledservice.scheduleatfixedrate(task1、0、2、
TimeUnit.seconds);
//新しいタスクを作成する2
myCallable task2 = new mycallable(mythreadfuture);
//タスク実行サービスを使用して5秒間待機してから、タスク2を実行します。実行後、タスク1は閉じられます。
myCallableFuture = fixedscheduledservice.schedule(task2、5、
TimeUnit.seconds);
System.out.println(myCallableFuture.get());
sixtscheduledservice.shutdownnow();
}
}