2

Similar documents
Agenda SPARC Enterprise T シリーズのご紹介 Java Concurrency Utilities のご紹介 Java SE 7 新機能のご紹介 まとめ 2

WEBシステムのセキュリティ技術

ただし 無作為にスレッドを複数実行すると 結果不正やデッドロックが起きる可能性がある 複数のスレッド ( マルチスレッド ) を安全に実行する ( スレッドセーフにする ) ためには 同期処理を用いるこ とが必要になる 同期処理は 予約語 synchronized で行うことができる ここでは sy

Microsoft Word - A04_AndroidプログラミングSTEP_画面800×1280

6 p.1 6 Java GUI GUI paintcomponent GUI mouseclicked, keypressed, actionperformed mouseclicked paintcomponent thread, 1 GUI 6.0.2, mutlithread C

新・明解Java入門

JavaプログラミングⅠ

ガイダンス

問題1 以下に示すプログラムは、次の処理をするプログラムである

(Microsoft PowerPoint - \223\306\217KJAVA\221\346\202R\224\ ppt)

55 7 Java C Java TCP/IP TCP/IP TCP TCP_RO.java import java.net.*; import java.io.*; public class TCP_RO { public static void main(string[] a

10/ / /30 3. ( ) 11/ 6 4. UNIX + C socket 11/13 5. ( ) C 11/20 6. http, CGI Perl 11/27 7. ( ) Perl 12/ 4 8. Windows Winsock 12/11 9. JAV

Programming-C-9.key

ガイダンス

JAVA とテンプレート

Prog2_9th

I HTML HashMap (i) (ii) :.java import java.net.*; import java.io.*; import java.util.hashmap; public class SimpleStopWatch { public static voi

text_10.dvi

Java (9) 1 Lesson Java System.out.println() 1 Java API 1 Java Java 1

例外(exception)とは何か

226

Exam : 1z0-809 日本語 (JPN) Title : Java SE 8 Programmer II Vendor : Oracle Version : DEMO 1 / 8 Get Latest & Valid 1z0-809-JPN Exam's Question and Answe

PowerPoint Presentation

Microsoft PowerPoint ppt

Make the Future Java FY13 PPT Template

ALG ppt

スライド 1

[HO-2] NetBeansとGlassFishではじめるJava EE7ハンズオン

目的 泡立ち法を例に Comparableインターフェイスの実装 抽象クラスの利用 型パラメタの利用 比較 入替 の回数を計測

Fork/Join Frameworkの性能について

Exam : 1z1-809-JPN Title : Java SE 8 Programmer II Vendor : Oracle Version : DEMO Get Latest & Valid 1z1-809-JPN Exam's Question and Answers 1 from Ac

Javaセキュアコーディングセミナー2013東京第1回 演習の解説

untitled

リファレンス,配列 例外処理

参考 - メインスレッドは JVM によって自動的に起動されるため 起動するコードを書く必要 はありません 今まで例題 演習で作成してきたプログラムは全てメインメソッドにて 動作している シングルスレッドです マルチスレッドマルチスレッドとは名前のとおり複数のスレッドと言う意味です マルチスレッドは

JavaプログラミングⅠ

Thread

Java プログラミング Ⅰ 3 回目変 数 今日の講義講義で学ぶ内容 変数とは 変数の使い方 キーボード入力の仕方 変 数 変 数 一時的に値を記憶させておく機能 変数は 型 ( データ型 ) と識別子をもちます 2 型 ( データ型 ) 変数に記憶する値の種類変数の型は 記憶できる値の種類と範囲

やさしいJavaプログラミング -Great Ideas for Java Programming サンプルPDF


Microsoft PowerPoint - prog09.ppt

JAVA H13 OISA JAVA 1

Microsoft PowerPoint - prog09.ppt

: : : TSTank 2

II 1 p.1 1 Servlet 1.1 Web Web WWW HTML CGI Common Gateway Interface Web HTML Web Web CGI CGI CGI Perl, PHP C JavaScript Web CGI HTML 1.2 Servlet Java

108 頁通過テスト 2. の本文 111 頁紹介文 136 頁練習 5-1 プログラム 136 頁練習 5-1 問 2 末尾に句点追加 158 頁練習問題文 161 頁練習 2-2 コメント文 166 頁練習 3-1 問 1 クラス名を挿入 178 頁通過テスト 3 文字 s を削除 180 頁コ

アプレットの作成

K227 Java 2

II Java :30 12:00 I. I IV II. III. IV. ( a d) V. : this==null, T == N A ActionListener C class D actionperformed G getsource I implements K

9.3 同期 共有データへの読み書きの同期 複数のスレッドから共有データを読み書きするときに発生する問題について 一つのフィールドに対して複数のスレッドが同時にアクセスする可能性がある場合 その順番によっては整合性が保てなくなる可能性があるので スレッドの制御フローが独立していては困ることがある 次

vol.30.}...`.X...b.h

JavaプログラミングⅠ

I. (i) Java? (A). 2Apples (B). Vitamin-C (C). Peach21 (D). Pine_Apple (ii) Java? (A). Java (B). Java (C). Java (D). JavaScript Java JavaScript Java (i

** 平成 16 年度 FE 午後問題 Java** 示現塾プロジェクトマネージャ テクニカルエンジニア ( ネットワーク ) など各種セミナーを開催中!! 開催日 受講料 カリキュラム等 詳しくは 今すぐアクセス!! 平成 16

Prog1_10th

Prog1_15th

Q&A集

Javaと マルチスレッド

A B 1: Ex. MPICH-G2 C.f. NXProxy [Tanaka] 2:

Microsoft PowerPoint - netprog_2015_07.ppt [互換モード]


untitled

Microsoft PowerPoint - Lecture_3

WAS V9 アナウンスメント・セミナー資料

Java演習(4) -- 変数と型 --


オブジェクト指向プログラミング・同演習 5月21日演習課題

< F2D B838A835882CC8CF68EAE2E6A7464>

Oracle9i JDeveloperによるWebサービスの構築

アルゴリズムとデータ構造1

SpringSecurity

Client Client public void sendobject(object message) String String Web Container String RemoteEndpoint String Endpoint throwsioexception, EncodeExcept

Java知識テスト問題

表示の更新もそういた作業のひとつに当たる スレッドの使用アニメーション アニメーションやシミュレーションなどは画面の更新が一定のタイミングで行われていく この連続した画面の更新をスレッドを利用して行う しかし paint() メソッドを直接呼び出して表示を更新することはできない その理由

Gartner Day

シミュレーションの簡単な例 GUI 無しのシミュレーションを作る GUI を作る パラメタを設定するデモンストレーションをする 2 オブジェクト指向プログラミング特論

Javaセキュアコーディングセミナー東京 第3回 入出力(File, Stream)と例外時の動作 演習解説

JavaプログラミングⅠ

< F2D834F838C A815B A CC>

Java プログラミング Ⅰ 3 回目変数 変数 変 数 一時的に値を記憶させておく機能型 ( データ型 ) と識別子をもつ 2 型 ( データ型 ) 変数の種類型に応じて記憶できる値の種類や範囲が決まる 型 値の種類 値の範囲 boolean 真偽値 true / false char 2バイト文

intra-mart im-JavaEE Framework

IE6 2 BMI chapter1 Java 6 chapter2 Java 7 chapter3 for if 8 chapter4 : BMI 9 chapter5 Java GUI 10 chapter6 11 chapter7 BMI 12 chap

intra-mart Accel Platform

ÿþ˜u#u·0¹0Æ0à0


rmi.book

B2-Servlet-0112.PDF

r3.dvi

intra-mart im-J2EE Framework

実行時のメモリ構造\(2\) Javaスタック内のフレーム間動作

問題1 以下に示すプログラムは、次の処理をするプログラムである

2016 年度 JAVA 講座第六週目 目次 パッケージ... 2 パッケージの作成... 2 パッケージの使用方法... 3 異なるパッケージ同名クラスの宣言... 4 パッケージの側面から見たアクセス修飾子... 4 ラッパークラス... 5 ラッパークラス利用法:キャスト... 5 ラッパーク

Microsoft Word - keisankigairon.ch doc

Java プログラミング Ⅰ 7 回目 switch 文と論理演算子 条件判断文 3 switch 文 switch 文式が case の値と一致した場合 そこから直後の break; までを処理し どれにも一致しない場合 default; から直後の break; までを処理する 但し 式や値 1

問 次の Fortran プログラムの説明及びプログラムを読んで、設問に答えよ。

I. EspressReport 100%Java JSP API II. EspressReport Report Designer Report Designer - Report Designer Web Java Web Web Report Designer import java.awt

PowerPoint プレゼンテーション

ユニット・テストの概要

Javaセキュアコーディングセミナー東京 第4回 メソッドとセキュリティ 演習解説

class IntCell { private int value ; int getvalue() {return value; private IntCell next; IntCell next() {return next; IntCell(int value) {this.value =

Transcription:

Yoshio Terada Java Evangelist http://yoshio3.com, Twitter : @yoshioterada 1

2

3

4

5

1996 6 JDK1.0 Thread Runnable 1997 1998 JDK1.1 J2SE1.2 2000 2002 J2SE 1.3 J2SE 1.4 2004 2006 Java SE 6 JSR-166x Java SE 5 JSR-166 Concurrency Utilities

2011 Java SE 7 JSR-166y Fork/Join 2013 Java SE 8 JSR-166e Concurrency Utilities 7

class MyWebServer{! public static void main(string argv[]){! ServerSocket socket = new ServerSocket(80);! while(true){! final Socket conn = socket.accept();! Runnable r = new Runnable(){! publiv void run(){! 8 addconnqueue(conn);// サーバ処理 }};! new Thread(r).start();! }! } }!

Thread-1 Thread-2 Thread-3 new Thread(r).start(); Thread-n 9

-Xss Thread-1 Thread-1 用スタック Thread-2 Thread-2 用スタック Thread-3 Thread-3 用スタック Thread-n Thread-n 用スタック スタック 10

スレッドを無制限に生成する欠点 Java VM や OS に負荷 スレッド生成ごとにメモリを消費 スレッド生成数には上限があり コンテキスト スイッチの切り替え 11

12

Java Concurrency Utilities とは 並列処理の実装をかんたんに!! 13 並列処理用の簡易 API を提供 スケーラビリティ パフォーマンス 保守性 可読性の向上 スレッド セーフ

JSR-166 で提供された機能 14 タスクの非同期実行 並行コレクション ロック シンクロナイザ アトミック処理

利用可能なクラスと拡張 Executors, Thread Pool, Futures コレクション: Queues, Blocking Queues, Concurrent HashMap ロック 同期: Semaphores, Barriers, Atomic変数 他の拡張 15

public interface Executor{! void execute(runnable command);! }! 16

public interface ExecutorService extends Executor{! void shutdown();! List<Runnable> shutdownnow();! boolean isshutdown();! boolean isterminated();! boolean awaittermination(long timeout,! TimeUnit unit);! <T> Future<T> submit(callable<t> task)! 他! }! 17

static int CPU_NUM =! Runtime.getRuntime().availableProcessors();! ExecutorService pool =! Executors.newFixedThreadPool(CPU_NUM);! public static void main(string argv[]){! ServerSocket socket = new ServerSocket(80);! while(true){! final Socket conn = socket.accept();! Runnable r = new Runnable(){! public void run(){;// 何らかの処理 } };! pool.execute(r);! }}! 18

ExecutorService pool =! Executors.newFixedThreadPool(CPU_NUM); pool.execute(r); LinkedBlockingQueue (FIFO) T1 T2 T3 T4 ThreadFactory newfixedthreadpool Tn 19

Concurrency Utilities の導入効果 効率的にスレッド実行が可能 スレッド ライフサイクル管理も可能 20

21

1998 JPE 1999 J2EE 1.2 JMS 2001 2003 J2EE 1.4 J2EE 1.3 MDB 2006 Java EE 5 2009 Java EE 6 Servlet EJB 22

23

24

25

@Stateless! public class MailAddressRegisterEJB {! @Resource(mappedName = "java:comp/jmsconfact")! ConnectionFactory conn;! @Resource(mappedName = "jms/mailregistqueue")! Queue queue;! public void registemailaddress(string address){! try(jmscontext context = conn.createcontext()){! context.createproducer().send(queue,! address);}}} 26

@MessageDriven(mappedName = "jms/mailregistqueue")! public class SendMessageMDB implements MessageListener! { public SendMessageMDB(){}! @Inject MailSender mailsender;! @Override! public void onmessage(message message) {! try {! TextMessage msg = (TextMessage) message;! mailsender.sendmessage(msg.gettext());! } catch (JMSException jmse) {! jmse.printstacktrace();! }! }} 27

28

@WebServlet(name = "MailSenderServlet", urlpatterns =! {"/MailSenderServlet"}, asyncsupported = true)! public class MailSenderServlet extends HttpServlet {! protected void processrequest(! HttpServletRequest request,! HttpServletResponse response)! throws ServletException, IOException {! AsyncContext ac = request.startasync();! ac.start(new MailSenderRunnable(ac));! }! 29

30

@Stateless! public class SyncEmailSenderEJB {! @Inject! MailSender mailsend;! public void syncsendmessage(string email){! mailsend.sendmessage(email);! }! @Asynchronous! public void asyncsendmessage(string email){! mailsend.sendmessage(email);! }! }! 31

32

Web/EJB コンテナ EJB JSP Servlet Java EE 関連機能 (JAX-RS,JavaMail, CDI など ) Runnable Callable 33

Web/EJB コンテナ EJB JSP Servlet Runnable Callable Java EE 関連機能 (JAX-RS,JavaMail, CDI など ) ManagedExecutor Service ManagedScheduledExecutorService Concurrency Utilities for EE ContextService ManagedThreadFactory 34

35

タスクを実装 A implements Runnable B implements Callable サーバ側で設定を実施 デフォルト設定も利用可 非同期タスクを実装 リソース インジェクションでサーバ管理スレッドを利用 36

public class MyRunnableTask implements Runnable {! @Override! public void run() {! try {! Thread.sleep(10000); } catch (InterruptedException ex) {! logger.log(level.severe, null, ex);! }! }! }! 37

public class MyCallableTask implements! Callable<String> {! @Override! public String call() throws Exception {! return Hello World ;! }! }! 38

39

@Stateless! public class MyManagedExecutorService {! @Resource(name =! "concurrent/defaultmanagedexecutorservice")! ManagedExecutorService managedexecsvc;! public void execexecutorservice() {! MyRunnableTask task = new MyRunnableTask();! managedexecsvc.submit(task);! MyCallableTask singletask =! new MyCallableTask("Foo Bar");! Future<String> singlefuture =! managedexecsvc.submit(singletask);}! 40

41

タスクを実装 A implements Runnable B implements Callable サーバ側で設定を実施 デフォルト設定も利用可 非同期タスクを実装 リソース インジェクションでサーバ管理スレッドを利用 42

43

@Stateless! public class MyManagedScheduledExecutorService{! @Resource(name = "concurrent/! DefaultManagedScheduledExecutorService")! ManagedScheduledExecutorService managedscheduledexecsvc;! public void execscheduledexecutorservice() {! MyRunnableTask task = new MyRunnableTask();! managedscheduledexecsvc.schedule(! task, 60L, TimeUnit.SECONDS);! }! 44

@Stateless! public class MyManagedScheduledExecutorService{! @Resource(name = "concurrent/! DefaultManagedScheduledExecutorService")! ManagedScheduledExecutorService managedscheduledexecsvc;! public void execscheduledexecutorservice() {! MyRunnableTask task = new MyRunnableTask();! managedscheduledexecsvc.schedule(! task, new MyTrigger(new Date(), 10, 1000) }! 45

import javax.enterprise.concurrent.trigger;! public class MyTrigger implements Trigger {! @Override! public Date getnextruntime(lastexecution le,! Date date){! }! @Override! public boolean skiprun(lastexecution le,! Date date) {! }! }! 46

47

submit() の実行 submit 成功 tasksubmitted Submitted taskstarting キャンセル 中止 タスクの実行準備 タスク実行 taskaborted Started キャンセル 中止 taskdone タスク実行完了 Done 48

public class MyManagedTaskListener implements! ManagedTaskListener {! public void tasksubmitted(future<?> future,! ManagedExecutorService mes, Object o) {! }! public void taskstarting(future<?> future,! ManagedExecutorService mes, Object o) {! }! public void taskaborted(future<?> future,! ManagedExecutorService mes, Object o, Throwable thrwbl){! }! public void taskdone(future<?> future,! ManagedExecutorService mes, Object o, Throwable thrwbl){! }! }! 49

@Resource(name = "concurrent/! MyManagedExecutorService")! ManagedExecutorService manageexecsvc;! public void invokemytasklistener() {! MyRunnableTask task = new MyRunnableTask();! MyManagedTaskListener listener =! new MyManagedTaskListener();! Runnable taskwithlistener =! ManagedExecutors.managedTask(task, listener);! manageexecsvc.execute(taskwithlistener);! }! 50

51

public class MyRunnable implements Runnable{! @Override! public void run() {! System.out.println( オリジナル メソッド呼び出し ");! }! } 52

public class MyInvocationHandler implements InvocationHandler {! private Object underlying;! public MyInvocationHandler(Object underlying) {! this.underlying = underlying;! @Override! public }! Object invoke(object proxy, Method method,! Object[] args) throws Throwable {! System.out.println( オリジナルの呼び出しの前処理 ");! Object ret = method.invoke(underlying, args);! System.out.println( オリジナルの呼び出しの後処理 ");! return ret;}} 53

MyRunnable public class task MyDynamicProxy = new MyRunnable();! {! InvocationHandler public static void handler main(string = new! argv[]){! ここで! MyInvocationHandler(task);! Runnable }}! proxy =! (Runnable)Proxy.newProxyInstance(! MyRunnable.class.getClassLoader(),! new Class[]{Runnable.class}, handler);! ExecutorService exec =! Executors.newSingleThreadExecutor();! exec.submit(proxy); 54

ExecutorService exec =! Executors.newSingleThreadExecutor();! exec.submit(proxy);! 55

56

@Stateless! public class ContextServiceManager {! @Resource(name = "concurrent/defaultcontextservice")! ContextService ctxsvc;! public void execsimplecontextservice() {! ExecutorService singlethreadexecutor =! Executors.newSingleThreadExecutor(threadFactory);! MyRunnableTask task = new MyRunnableTask();! Runnable proxiedtask =! ctxsvc.createcontextualproxy(task,runnable.class);! singlethreadexecutor.submit(proxiedtask);}}! 57

58

59

60

@Resource(name = "concurrent/! DefaultManagedThreadFactory")! ManagedThreadFactory threadfactory;! public void execthreadfactory() {! MyRunnableTask task = new MyRunnableTask();! Thread taskthread =! threadfactory.newthread(task);! taskthread.start();! }! 61

ExecutorService threadpoolexecutor =! Executors.newFixedThreadPool(4,threadFac);! threadpoolexecutor = new ThreadPoolExecutor(4, 4,! 0L, TimeUnit.MILLISECONDS,! new LinkedBlockingQueue<Runnable>(),! threadfac);! 62 java.util.concurrent.threadpoolexecutor

@Resource(name = "concurrent/! DefaultManagedThreadFactory")! ManagedThreadFactory threadfactory;! public void execthreadfactory() {! MyRunnableTask task = new MyRunnableTask();! ExecutorService exec =! new ThreadPoolExecutor(4, 4,! 0L, TimeUnit.MILLISECONDS,! new LinkedBlockingQueue<Runnable>(),! threadfactory);! exec.submit(task);}! 63

64

65

66

67

68