Java同時プログラミング:ThreadPoolExecutor+Callable+Future(FutureTask)スレッドの実行状況を検出...
5192 ワード
問題のように(要点をまとめる) ThreadPoolExecutorを使用してスレッドを作成し、Callable+Futureを使用してスレッドの実行状況を実行し、検出する. V get(long timeout,TimeUnit unit)throws InterruptedException,ExecutionException,TimeoutExceptionは上記のget機能と同様に、設定タイムアウト時間が多くなります.パラメータtimeoutはタイムアウト時間を指定し、uintは時間の単位を指定し、列挙クラスTimeUnitに関連する定義があります.計算がタイムアウトした場合、TimeoutExceptionが放出されます. はFutureTask:FutureTask task=(FutureTask)poolExecutor.submit(new MyRunner(500); 結局:class FutureTask implements RunnableFuture,interface RunnableFuture extends Runnable,Future; FutureTaskはスレッドプールにスレッドとして投げ込まれて実行することができ、次のFutureのようにスレッドの実行状況を検出することもできる. のスレッドプールpoolExecutor.submitはinterface RunnableFuture extends Runnable,Future(ソースコードを参照してください): を返します.
参考学習記事リストリンク1:https://www.cnblogs.com/dolphin0520/p/3949310.html リンク2:『java同時プログラミングの芸術』 https://blog.csdn.net/yangliuhbhd/article/details/70276153
1.テーマ
2.コード
3.テストメインスレッド起動
テスト結果
テスト結果2プローブ時間task.get(1000,TimeUnit.MILLISECONDS)を修正する.
転載先:https://www.cnblogs.com/zhazhaacmer/p/11362316.html
public Future submit(Runnable task, T result) {
if (task == null) throw new NullPointerException();
RunnableFuture ftask = newTaskFor(task, result);
execute(ftask);
return ftask;
}
参考学習記事リスト
1.テーマ
Future , , 。 Java 。
Future , Future, V Future 。 Future :
boolean cancel (boolean mayInterruptIfRunning) 。 ,
boolean isCancelled () , , true
boolean isDone () 。 、 , true
V get () throws InterruptedException, ExecutionException , V 。InterruptedException , ExecutionException , , CancellationException
V get (long timeout, TimeUnit unit) throws InterruptedException, ExecutionException, TimeoutException get , 。 timeout ,uint , TimeUnit 。 , TimeoutException
Future java.util.concurrent.FutureTask javax.swing.SwingWorker。 FutureTask 。FutureTask Runnable , Executor 。
2.コード
/**
* , 100
*/
class MyRunner implements Callable{
private int sleepTime ;
public MyRunner(int sleepTime) {
this.sleepTime = sleepTime;
}
Logger logger = Logger.getLogger("myRunner");
@Override
public Integer call() throws Exception {
logger.info(" ");
Thread.sleep(sleepTime);
int sum = 0;
for(int i=1;i<=100;i++){
sum += i;
}
logger.info(sleepTime/1000.0+"s , .100 :"+sum);
return sum;
}
}
3.テストメインスレッド起動
import java.util.concurrent.*;
import java.util.logging.Logger;
/** https://www.cnblogs.com/dolphin0520/p/3949310.html
* 《java 》
*/
public class Test {
private static Logger logger = Logger.getLogger("Test");
public static void main(String[] args) {
/**
* Callable
* ,call() V
* Callable ThreadPoolExecutor
* futureTask
*/
BlockingQueue queue = new SynchronousQueue<>();
ThreadFactory nameThreadFactory = new ThreadFactory() {
@Override
public Thread newThread(Runnable r) {
return new Thread(r);
}
};
ThreadPoolExecutor poolExecutor =
new ThreadPoolExecutor(2, 2, 0, TimeUnit.MILLISECONDS, queue, nameThreadFactory);
/**
* Callable runnable
* */
Future task = poolExecutor.submit(new MyRunner(500));
poolExecutor.shutdown();
try {
task.get(100,TimeUnit.MILLISECONDS);
logger.info(" submit ? done?");
boolean done = task.isDone();
logger.info(String.valueOf(done));
// ,
if(!done){
task.cancel(true);
}
} catch (InterruptedException e) {
task.cancel(true);
} catch (ExecutionException e) {
task.cancel(true);
} catch (TimeoutException e) {
logger.info(" ");
task.cancel(true);
}
logger.info(" ");
}
}
テスト結果
16, 2019 10:05:18 com.thread.MyRunner call
:
16, 2019 10:05:18 com.thread.Test main
:
16, 2019 10:05:18 com.thread.Test main
:
テスト結果2プローブ時間task.get(1000,TimeUnit.MILLISECONDS)を修正する.
16, 2019 10:25:20 com.thread.MyRunner call
:
16, 2019 10:25:20 com.thread.MyRunner call
: 0.5s , .100 :5050
16, 2019 10:25:20 com.thread.Test main
: submit ? done?
16, 2019 10:25:20 com.thread.Test main
: true
16, 2019 10:25:20 com.thread.Test main
:
転載先:https://www.cnblogs.com/zhazhaacmer/p/11362316.html