当前位置: 首页 > news >正文

基本パターン(単一スレッド)

 

別スレッドにするタスクの作成

別にスレッドにしたい処理を、Runnable インタフェースを実装したクラスのrumメソッドに実装する。

public class TestRunnable implements Runnable { public void run() { // スレッドIDを出力する System.out.println(Thread.currentThread().getId()); } } 

スレッドの生成とタスクの実行

ExecutorService クラスを利用して、スレッドの生成・タスクの実行を行う。
ここでは、「newSingleThreadExecutor」でスレッドを一つのみ生成し、5回タスクを実行している。

ExecutorService exec = Executors.newSingleThreadExecutor(); for (int i = 0; i < 5; i++) { exec.submit(new TestRunnable()); } 

実行結果

1スレッドのみなので、すべて同じスレッドIDが出力される。

44
44
44
44
44

固定数の複数スレッド生成

newFixedThreadPoolを使用すると、固定数のスレッドを生成できる。

// 引数に生成するスレッド数を渡す
ExecutorService exec = Executors.newFixedThreadPool(3); for (int i = 0; i < 5; i++) { exec.submit(new TestRunnable()); } 

3つの固定スレッドを生成したので、3つのスレッドを使いまわしている。

24
24
24
26
25

必要に応じて複数スレッド生成

newCachedThreadPoolを使用すると、必要に応じてスレッドを生成する。
60秒間使用されなかったスレッドは破棄され、60秒未満であれば再利用される。

 ExecutorService exec = Executors.newCachedThreadPool(); for (int i = 0; i < 5; i++) { exec.submit(new TestRunnable()); } Thread.sleep(1 * 5000); System.out.println("--------5秒後---------"); for (int i = 0; i < 5; i++) { exec.submit(new TestRunnable()); } Thread.sleep(1 * 70000); System.out.println("--------70秒後---------"); for (int i = 0; i < 5; i++) { exec.submit(new TestRunnable()); } 

3回に分けて処理を実行。
最初の実行から、5秒後に実行した処理は同じスレッドを再利用している。
70秒後の実行では既にスレッドが破棄されて、新しいスレッドが生成されている。

26
24
25
27
28
--------5秒後---------
24
27
28
25
26
--------70秒後---------
31
33
30
32
29

実行結果を取得する

実行結果を返すタスクの作成

実行結果を返す処理は、Callableインタフェースを実装したクラスのcallメソッドに実装する。

public class TestCallable implements Callable<Long> { public Long call() throws Exception { //スレッドIDを返す return Thread.currentThread().getId(); } } 

タスクの実行と実行結果の取得

タスクの実行は、結果を返さない場合と同じく ExecutorService を使用するが、
戻り値としてFutureインタフェースを受け取る。

List<Future<Long>> list = new ArrayList<Future<Long>>(); for (int i = 0; i < 10; i++) { Future<Long> future = exec.submit(new TestCallable()); list.add(future); } //Future#getメソッドで結果を取得できる。実行中の場合は終了まで待つ。 for (Future<Long> future : list) { try { Long id = future.get(); } catch (InterruptedException e) { e.printStackTrace(); } catch (ExecutionException e) { e.printStackTrace(); } } 

引数を指定することで、指定した時間だけ実行結果を待つことができる。
指定した時間を超えると、TimeoutExceptionがスローされる。

//1秒間だけ待つ。
Long id = future.get(1, TimeUnit.SECONDS);

转载于:https://www.cnblogs.com/xpvincent/p/7753968.html

相关文章:

  • css左侧固定宽度,右侧自适应的几种实现方法
  • 可视化查询
  • Alpha 冲刺 (3/10)
  • 用GDB调试程序(一)
  • (转载)深入super,看Python如何解决钻石继承难题
  • 1000. A+B Problem
  • 儿童上网时间管控软件_GreenSurfOnline V0.1 使用说明 (以Windows后台服务形式存在,安装需要有一定电脑操作基础)...
  • 没事儿别优化!
  • Java并发案例04---生产者消费者问题03--使用ReentrantLock
  • Java日志框架-logback的介绍及配置使用方法(纯Java工程)(转)
  • 行外人浅谈“云计算”
  • PE 文件格式 详解 二
  • Linux Mint 教程
  • Jenkins-权限控制
  • 阿里 Linux服务器外网无法连接MySQL解决方法
  • [笔记] php常见简单功能及函数
  • 30天自制操作系统-2
  • input实现文字超出省略号功能
  • Java小白进阶笔记(3)-初级面向对象
  • Netty+SpringBoot+FastDFS+Html5实现聊天App(六)
  • python 学习笔记 - Queue Pipes,进程间通讯
  • supervisor 永不挂掉的进程 安装以及使用
  • 当SetTimeout遇到了字符串
  • 开发基于以太坊智能合约的DApp
  • 聊聊redis的数据结构的应用
  • 码农张的Bug人生 - 初来乍到
  • 我的业余项目总结
  • 小程序01:wepy框架整合iview webapp UI
  • 学习JavaScript数据结构与算法 — 树
  • ionic入门之数据绑定显示-1
  • MyCAT水平分库
  • Unity3D - 异步加载游戏场景与异步加载游戏资源进度条 ...
  • 基于django的视频点播网站开发-step3-注册登录功能 ...
  • ​iOS安全加固方法及实现
  • ​无人机石油管道巡检方案新亮点:灵活准确又高效
  • #【QT 5 调试软件后,发布相关:软件生成exe文件 + 文件打包】
  • (附源码)springboot电竞专题网站 毕业设计 641314
  • (一)eclipse Dynamic web project 工程目录以及文件路径问题
  • (一)基于IDEA的JAVA基础12
  • (原+转)Ubuntu16.04软件中心闪退及wifi消失
  • .equals()到底是什么意思?
  • .htaccess配置常用技巧
  • .NET 读取 JSON格式的数据
  • .NetCore项目nginx发布
  • @cacheable 是否缓存成功_让我们来学习学习SpringCache分布式缓存,为什么用?
  • @vue/cli 3.x+引入jQuery
  • [AX]AX2012 AIF(四):文档服务应用实例
  • [BJDCTF2020]The mystery of ip1
  • [CareerCup] 13.1 Print Last K Lines 打印最后K行
  • [DevOps云实践] 彻底删除AWS云资源
  • [hadoop读书笔记] 第十五章 sqoop1.4.6小实验 - 将mysq数据导入HBASE
  • [HDU3710]Battle over Cities
  • [hive] 窗口函数 ROW_NUMBER()
  • [IE技巧] 如何关闭Windows Server版IE的安全限制
  • [LeetCode刷题笔记]1 - 两数之和(哈希表)