JavaOne 2013 San Francisco Asyn-ConcurrencyOnEE7

Post on 27-Jan-2015

110 views 3 download

Tags:

description

 

Transcript of JavaOne 2013 San Francisco Asyn-ConcurrencyOnEE7

Copyright © 2012, Oracle and/or its affiliates. All rights reserved. 1

[ CON10982 ] Implementation of Async and Concurrent Applications in the Java EE Environment Yoshio Terada Java Evangelist http://yoshio3.com

Copyright © 2012, Oracle and/or its affiliates. All rights reserved. 3 Copyright © 2013, Oracle and/or its affiliates. All rights reserved. 3

If  you  have  some  questions,could  you  give  me  a  message  on  Twitter  with  following  hash  tag  ?

[#CON10982]My  Twitter  ID  :  @yoshioterada

Copyright © 2012, Oracle and/or its affiliates. All rights reserved. 4 Copyright © 2013, Oracle and/or its affiliates. All rights reserved. 4

The following is intended to outline our general product direction. It is intended for information purposes only, and may not be incorporated into any contract. It is not a commitment to deliver any material, code, or functionality, and should not be relied upon in making purchasing decisions. The development, release, and timing of any features or functionality described for Oracle’s products remains at the sole discretion of Oracle.

Copyright © 2012, Oracle and/or its affiliates. All rights reserved. 5

It is very easy to implement concurrent application on EE 7 environment. Customizable flexibly

Copyright © 2012, Oracle and/or its affiliates. All rights reserved. 6

Structure  of  My  Sesiosn

Review  of  Async/Concurrencyon  Java  SE  &  Java  EE6

Concurrency  Utilities  onJava  EE  7  

15-‐‑‒20  MinWith  Demo

40  MinWith  Demo

Copyright © 2012, Oracle and/or its affiliates. All rights reserved. 7

History  of  Async  Application  in  Java

Java  SEEnvironment

Copyright © 2012, Oracle and/or its affiliates. All rights reserved. 8

1996 1997

JDK1.0ThreadRunnable

20042006

JDK1.1

J2SE1.2

J2SE  1.3

J2SE  1.4

Java  SE  5JSR-‐‑‒166Concurrency  Utilities

Java  SE  6JSR-‐‑‒166x

Hisotry  of  Java  Thread

1998 2000 2002

Copyright © 2012, Oracle and/or its affiliates. All rights reserved. 9

2011

・・・・・・・・

・・

・・・・・・・・

Java  SE  7JSR-‐‑‒166yFork/Join

Java  SE  8Lambda  Expression  &  JSR-‐‑‒166eConcurrency  Utilities

2014

History  of  Java  SE  Thread

Copyright © 2012, Oracle and/or its affiliates. All rights reserved. 10 Copyright © 2013, Oracle and/or its affiliates. All rights reserved. 10

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(){ ! addConnQueue(conn);//Server opeartion   }};! new Thread(r).start();! }!} }!

Ex  :  Impl  of  MultiThread  Web  Server

Create  new  

Thread  for  

request

No  more  Recommend  This  way

Copyright © 2012, Oracle and/or its affiliates. All rights reserved. 11

new  Thread(r).start();

Thread-‐‑‒1

Thread-‐‑‒2

Thread-‐‑‒3

Thread-‐‑‒n

Generated  Thread  Indefinitely・・・

Copyright © 2012, Oracle and/or its affiliates. All rights reserved. 12

Thread-‐‑‒1

Thread-‐‑‒2

Thread-‐‑‒3

Thread-‐‑‒n

Ex  :  Stack  area  is  also  allocated

スタック

Thread-‐‑‒1  Stack

Thread-‐‑‒2  Stack

Thread-‐‑‒3  Stack

Thread-‐‑‒n  Stack

… …

-‐‑‒Xss

Copyright © 2012, Oracle and/or its affiliates. All rights reserved. 13

Load  of  Java  VM  and  OS

Memory  Consumption  for  each  thread

UpperLimit  of  the  number  of  thread  creation

Overhead  of  the  context  switch

Disadvantage  of  unlimited  thread

Copyright © 2012, Oracle and/or its affiliates. All rights reserved. 14

Copyright © 2012, Oracle and/or its affiliates. All rights reserved. 15

Java  Concurrency  Utilities

•  Easy  API  to  implement  concurrency  application

•  Provide  simple  and  easy  API•  Scalability,  Performance,  Maintainability,  Thread  safe,  easy  to  understand

Copyright © 2012, Oracle and/or its affiliates. All rights reserved. 16

JSR-‐‑‒166  Overview

•  Async  task  operation•  Concurrency  Collection•  lock,  synchronizer•  Atomic  operation

Copyright © 2012, Oracle and/or its affiliates. All rights reserved. 17

Useful  classes

•  Executors,  Thread  Pool,  Futures  •  Collection:  Queues,  Blocking  Queues,  Concurrent  

HashMap•  Lock,  synchronization:  Semaphores,  Barriers,  Atomic  

variable•  Others  …

Copyright © 2012, Oracle and/or its affiliates. All rights reserved. 18 Copyright © 2013, Oracle and/or its affiliates. All rights reserved. 18

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

Executor  InterfaceAsync  invocation

Copyright © 2012, Oracle and/or its affiliates. All rights reserved. 19 Copyright © 2013, Oracle and/or its affiliates. All rights reserved. 19

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) ! // and more …!} !

ExecutorService  InterfaceLifecycle  management,  get  return  value

Copyright © 2012, Oracle and/or its affiliates. All rights reserved. 20 Copyright © 2013, Oracle and/or its affiliates. All rights reserved. 20

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(){;//do something      } };! pool.execute(r);! }}!

WebServer    implemented  by  Executor

Copyright © 2012, Oracle and/or its affiliates. All rights reserved. 21

newFixedThreadPool

ExecutorService execution using fixed Thread Pool

LinkedBlockingQueue  (FIFO)

ThreadFactory…T1 T2 T3 T4 Tn

ExecutorService pool =!   Executors.newFixedThreadPool(CPU_NUM);

pool.execute(r);

•  Reuse  the  created  Thread

•  Number  of  max  Thread

•  Queing  of  incoming  request

Copyright © 2012, Oracle and/or its affiliates. All rights reserved. 22

Execute  Thread  more  Efficiently

Possible  to  manage  the  lifecycle  of  Thread

Benefit  of  Concurrency  Utilities

Copyright © 2012, Oracle and/or its affiliates. All rights reserved. 23

History  of  Async  on  Java  EE

JMS(MDB)Async  ServletAsync  EJB

Copyright © 2012, Oracle and/or its affiliates. All rights reserved. 24

1998

2009

JPE

J2EE  1.4

Java  EE  6Async  ServletAsync  EJB

History  of  Async  on  Java  EE

19992001

2003

Java  EE  5

2006

J2EE  1.2JMS

J2EE  1.3MDB

Copyright © 2012, Oracle and/or its affiliates. All rights reserved. 25

JMS  &  MDBMore  Easy  :  Java  EE  7

Copyright © 2012, Oracle and/or its affiliates. All rights reserved. 26

Message  Provider

JNDI  Naming  Space

ConnFactory

jms/MyConFactory

App  Server  Administrator

Destination

jms/MyQueue

Queue  Name

Delegate  the  operation  to  External  Message  Provider

Copyright © 2012, Oracle and/or its affiliates. All rights reserved. 27

JNDI  Name  Space

ConnFactory Destination

JMS  Client

Resource  Injection  jms/MyFactory  jms/MyQueue

JMS  Client  connect  to  Message  Provider  via  JNDI  lookup

Message  Provider

Queue  NameDeveloper

Developer  refer  to  the  JNDI

Copyright © 2012, Oracle and/or its affiliates. All rights reserved. 28 Copyright © 2013, Oracle and/or its affiliates. All rights reserved. 28

@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);}}}

Send  :  JMS  2.0  (Java  EE  7)

Copyright © 2012, Oracle and/or its affiliates. All rights reserved. 29 Copyright © 2013, Oracle and/or its affiliates. All rights reserved. 29

@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();! }! }}

Receive:  MDB  (Java  EE  7)

Copyright © 2012, Oracle and/or its affiliates. All rights reserved. 30

Servlet  3.0  :  since  Java  EE  6(asyncSupported  =  true)

Copyright © 2012, Oracle and/or its affiliates. All rights reserved. 31 Copyright © 2013, Oracle and/or its affiliates. All rights reserved. 31

@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));! }}!

Servlet  3.0  :  Async  Servlet

Copyright © 2012, Oracle and/or its affiliates. All rights reserved. 32

EJB  3.1  :  since  Java  EE  6@Asynchronous

Copyright © 2012, Oracle and/or its affiliates. All rights reserved. 33 Copyright © 2013, Oracle and/or its affiliates. All rights reserved. 33

@Stateless!public class SyncEmailSenderEJB {! @Inject! MailSender mailsend;! public void syncSendMessage(String email){! mailsend.sendMessage(email);! }!! @Asynchronous! public void asyncSendMessage(String email){! mailsend.sendMessage(email);! }}!

EJB  3.1  (Java  EE  6)

Copyright © 2012, Oracle and/or its affiliates. All rights reserved. 34

Concurrency  Utilities  for  EE

Copyright © 2012, Oracle and/or its affiliates. All rights reserved. 35

Application  Servers

Java  SE

Web/EJB  Container

EJB JSP

Servlet

Runnable

CallableOther  Java  EE  functionality  (JAX-‐‑‒RS,JavaMail,  CDI,  etc)

Not  recommended  to  create  Threadon  Java  EE  environment.

Thread  run  outside  of  the  Container

Copyright © 2012, Oracle and/or its affiliates. All rights reserved. 36

Application  Servers

Java  SE

Web/EJB  Container

EJB JSP

Servlet

Runnable

Callable

Concurrency  Architecture  on  EE  7

Other  Java  EE  function(JAX-‐‑‒RS,JavaMail,  CDI,  etc)

ManagedExecutor  ServiceManagedScheduledExecutorServiceContextServiceManagedThreadFactoryConcurrency  Utilities  for  EE

Copyright © 2012, Oracle and/or its affiliates. All rights reserved. 37 Copyright © 2013, Oracle and/or its affiliates. All rights reserved. 37

Memo

It  is  easy  to  implement  !!

It  is  possible  to  Customize  !!

Small  Package  :  Total  12  class

Copyright © 2012, Oracle and/or its affiliates. All rights reserved. 38 Copyright © 2013, Oracle and/or its affiliates. All rights reserved. 38

Usecase  senario?

For  long  running  process

Effective  use  of  hardware!

For  executing  regularly

Copyright © 2012, Oracle and/or its affiliates. All rights reserved. 39 Copyright © 2013, Oracle and/or its affiliates. All rights reserved. 39

Usecase  senario

Would  like  to  run  a  Task  on  Java  EE  

environmentWhich  is  implemented

 on  Java  SE  

environment.

Copyright © 2012, Oracle and/or its affiliates. All rights reserved. 40 Copyright © 2013, Oracle and/or its affiliates. All rights reserved. 40

Important  Interfaces

Best  4

• ManagedExecutorService

• ManagedScheduledExecutorService

• ManagedThreadFactory

• ContextService

Copyright © 2012, Oracle and/or its affiliates. All rights reserved. 41

Easy  development  To  create  Async  Task(ManagedExecutorService)

Copyright © 2012, Oracle and/or its affiliates. All rights reserved. 42 Copyright © 2013, Oracle and/or its affiliates. All rights reserved. 42

Memo Most easy way !!

Copyright © 2012, Oracle and/or its affiliates. All rights reserved. 43

Implements  some  Task

A  implements  RunnableB  implements  Callable

Implement  Async  Task

Use  the  configured  managed  Thread  by  resource  Injection

Configure  Server  side

Possible  to  use  the  default  configuration

1 2

Step  to  create  Async  Task

Copyright © 2012, Oracle and/or its affiliates. All rights reserved. 44 Copyright © 2013, Oracle and/or its affiliates. All rights reserved. 44

public class MyRunnableTask implements Runnable {! @Override! public void run() { ! try {! Thread.sleep(10000); //do Something } catch (InterruptedException ex) {! logger.log(Level.SEVERE, null, ex);! }! }!}!

Implement  Runnable  Task1

Copyright © 2012, Oracle and/or its affiliates. All rights reserved. 45 Copyright © 2013, Oracle and/or its affiliates. All rights reserved. 45

Implement  Callable  Task        ●  Possible  to  get  the  return  value        ●  Possible  to  throw  the  Exception

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

Copyright © 2012, Oracle and/or its affiliates. All rights reserved. 46

Configuration  on  Server  Side2

Copyright © 2012, Oracle and/or its affiliates. All rights reserved. 47 Copyright © 2013, Oracle and/or its affiliates. All rights reserved. 47

@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);}!

Exec  Async  Task  on  EJB3

Inject  the  resource

Copyright © 2012, Oracle and/or its affiliates. All rights reserved. 48

Scheduling  the  Async  Task(ManagedScheduledExecutorService)

Copyright © 2012, Oracle and/or its affiliates. All rights reserved. 49

Implement  the  Task

A  implements  RunnableB  implements  Callable

Implement  Async  Task

Use  the  configured  managed  Thread  by  resource  Injection

Configure  on  Server  Side

Possible  to  use  default  configuration

1 2

Scheduling  Async  Task  Impl

Copyright © 2012, Oracle and/or its affiliates. All rights reserved. 50

Server  Side  Configuration2

Copyright © 2012, Oracle and/or its affiliates. All rights reserved. 51 Copyright © 2013, Oracle and/or its affiliates. All rights reserved. 51

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

Exec  Async  Scheduled  Task3

Exec  TaskAfter  1  min.

Copyright © 2012, Oracle and/or its affiliates. All rights reserved. 52 Copyright © 2013, Oracle and/or its affiliates. All rights reserved. 52

@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) }!

You  can  Implement  own  trigger

Exec  Async  Scheduled  Task3

Copyright © 2012, Oracle and/or its affiliates. All rights reserved. 53 Copyright © 2013, Oracle and/or its affiliates. All rights reserved. 53

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) {!! }!}! On  Trigger  you  can  i

mplement  

The  next  run  time  and/or  skip

Copyright © 2012, Oracle and/or its affiliates. All rights reserved. 54

Management  and  Monitoringof  Task  Lifecycle

Copyright © 2012, Oracle and/or its affiliates. All rights reserved. 55

Lifecycle  of  Task

taskSubmitted Submitted taskStarting

taskAborted Started

taskDone

Done

submit() submitsuccess

Cancel  or  Abort

About  to  Start

Running  Task

Cancelled  or  aborted Task  has  finished

Task  Monitoring

    :  can  write

Rejected

Copyright © 2012, Oracle and/or its affiliates. All rights reserved. 56 Copyright © 2013, Oracle and/or its affiliates. All rights reserved. 56

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){! }!}!

Create  own  Task  Listener

which  is  implemented  by  

ManagedTaskListener

Copyright © 2012, Oracle and/or its affiliates. All rights reserved. 57 Copyright © 2013, Oracle and/or its affiliates. All rights reserved. 57

@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);!}!

Copyright © 2012, Oracle and/or its affiliates. All rights reserved. 58

Detail  of  Internal  BehaviorContextSerivce

Copyright © 2012, Oracle and/or its affiliates. All rights reserved. 59 Copyright © 2013, Oracle and/or its affiliates. All rights reserved. 59

ManagedExecutorService

ManagedScheduledExecutorService

We  can  understand  :

it  is  very  easy  to  implement  the  concurrent  t

ask            

by  Resource  Injection.

We  can  manage  the  lifecycle  of  tasks.

Copyright © 2012, Oracle and/or its affiliates. All rights reserved. 60 Copyright © 2013, Oracle and/or its affiliates. All rights reserved. 60

How  to  run  the  concurrent  

tasks  internally  ?

Copyright © 2012, Oracle and/or its affiliates. All rights reserved. 61 Copyright © 2013, Oracle and/or its affiliates. All rights reserved. 61

MemoInternally  :

Use  “Dynamic  Proxy”  and

add  some  context  informations

Copyright © 2012, Oracle and/or its affiliates. All rights reserved. 62 Copyright © 2013, Oracle and/or its affiliates. All rights reserved. 62

Memo

Do  you  remember  

Dynamic  Proxy  ?

(java.lang.reflect.Proxy)

Copyright © 2012, Oracle and/or its affiliates. All rights reserved. 63

Method  Invocation  by  Dynamic  Proxypublic class MyRunnable implements Runnable{! @Override! public void run() {!   System.out.println(“Original Method Invoke");!  }!}

This  Task  will  be  executed  via  

Dynamic  Proxy

Copyright © 2012, Oracle and/or its affiliates. All rights reserved. 64

Implement  of  own  InvocationHandler

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(”Pre Invoke of orign method");! Object ret = method.invoke(underlying, args);! System.out.println(“Post Invoke of orign method");! return ret;}!}

Copyright © 2012, Oracle and/or its affiliates. All rights reserved. 65

Execute  the  Task  via  Dynamic  Proxy

public class MyDynamicProxy {! public static void main(String argv[]){!   //… create proxied Task here!}}!

MyRunnable task = new MyRunnable();!InvocationHandler handler = new !                   MyInvocationHandler(task);!Runnable proxy = !    (Runnable)Proxy.newProxyInstance(!       MyRunnable.class.getClassLoader(), !       new Class[]{Runnable.class}, handler);!ExecutorService exec = !           Executors.newSingleThreadExecutor();!exec.submit(proxy);

Copyright © 2012, Oracle and/or its affiliates. All rights reserved. 66

Result  of  execute  Task  via  Dynamic  Proxy

Pre  Invoke  of  orign  methodOriginal  Method  InvokePost  Invoke  of  orign  method

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

Useful  for  AOP

Copyright © 2012, Oracle and/or its affiliates. All rights reserved. 67 Copyright © 2013, Oracle and/or its affiliates. All rights reserved. 67

Memo

InvocationHandler  is  

implemented  by  App  Server

*  GlassFish  v4.0  

    org.glassfish.enterprise.concurrent.inter

nal.  

    ContextProxyInvocationHandler

Copyright © 2012, Oracle and/or its affiliates. All rights reserved. 68

Configuration  on  ServerSide1

Copyright © 2012, Oracle and/or its affiliates. All rights reserved. 69 Copyright © 2013, Oracle and/or its affiliates. All rights reserved. 69

@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);}}! !

CreateDynamic  Proxy

Task  Execution  with  Context2

Copyright © 2012, Oracle and/or its affiliates. All rights reserved. 70 Copyright © 2013, Oracle and/or its affiliates. All rights reserved. 70

Original  Task

Task  which  is  created  byDynamic  Proxy

Memo

It  is  possible  to  run  the  Task  on  EE  with  Context.  

Copyright © 2012, Oracle and/or its affiliates. All rights reserved. 71

Detail  of  Internal  BehaviorThreadFactory

Copyright © 2012, Oracle and/or its affiliates. All rights reserved. 72 Copyright © 2013, Oracle and/or its affiliates. All rights reserved. 72

Memo • we can implement custom managed thread

pool on the program side not server side

and can execute from the created pool.

※ It is possible to customize the way to

create a Thread by program.

Copyright © 2012, Oracle and/or its affiliates. All rights reserved. 73

Configuration  on  ServerSide1

Copyright © 2012, Oracle and/or its affiliates. All rights reserved. 74 Copyright © 2013, Oracle and/or its affiliates. All rights reserved. 74

@Resource(name = "concurrent/! DefaultManagedThreadFactory")!ManagedThreadFactory threadFactory;!public void execThreadFactory() {! MyRunnableTask task = new MyRunnableTask();! Thread taskThread = ! threadFactory.newThread(task);! taskThread.start();!}!

 Create  Thread  via  ThreadFactory(It  is  for  long  running  process)

2

Simple

Copyright © 2012, Oracle and/or its affiliates. All rights reserved. 75 Copyright © 2013, Oracle and/or its affiliates. All rights reserved. 75

ExecutorService threadPoolExecutor = ! Executors.newFixedThreadPool(4,threadFac);!!!threadPoolExecutor = new ThreadPoolExecutor(4, 4,!                    0L, TimeUnit.MILLISECONDS,!                    new LinkedBlockingQueue<Runnable>(), !                    threadFac);!

 It  is  possible  to  create  custom  Thread  Pool  by  using  ThreadPoolExecutor

Above  two  code  is  same

java.util.concurrent.ThreadPoolExecutor

Copyright © 2012, Oracle and/or its affiliates. All rights reserved. 76 Copyright © 2013, Oracle and/or its affiliates. All rights reserved. 76

@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);}!

Create  new  Thread  from  Custom  Thread  Pool

Copyright © 2012, Oracle and/or its affiliates. All rights reserved. 77

Finally

Copyright © 2012, Oracle and/or its affiliates. All rights reserved. 78 Copyright © 2013, Oracle and/or its affiliates. All rights reserved. 78

Restriction  :

We  can  use  with  CDI  only  for

   @ApplicationScoped

   @Dependent

Note  :  Lifecycle  of  CDI

Copyright © 2012, Oracle and/or its affiliates. All rights reserved. 79 Copyright © 2013, Oracle and/or its affiliates. All rights reserved. 79

Restriction

You  canʼ’t  use  on  Application  

Client  Container

Copyright © 2012, Oracle and/or its affiliates. All rights reserved. 80 Copyright © 2013, Oracle and/or its affiliates. All rights reserved. 80

Restriction

We  canʼ’t  use  with  

Fork/Join  (ForkJoinPool).

Copyright © 2012, Oracle and/or its affiliates. All rights reserved. 81 Copyright © 2013, Oracle and/or its affiliates. All rights reserved. 81

Restriction

We  canʼ’t  invoke  lifecycle  method  of  

ExecutorService.

(ex.  shutdown,  shutdownNow)

※  ManagedExecutorService

※  ManagedScheduledExecutorService

Copyright © 2012, Oracle and/or its affiliates. All rights reserved. 82 Copyright © 2013, Oracle and/or its affiliates. All rights reserved. 82

ConclusionEffective  use  of  computer  assets    from  Async  to  Concurrent

Safe  and  easy  way  to  create  the  thread  on  Java  EE  environment

Flexible  customization

Copyright © 2012, Oracle and/or its affiliates. All rights reserved. 83 Copyright © 2013, Oracle and/or its affiliates. All rights reserved. 83

Related  Session[CON7948]  :  JSR  236:  Introduction  to  Concurrency  Utilities  for  Java  EE  1.0

Thursday,  Sep  26,  12:30  PM  -‐‑‒  1:30  PM  Parc  55  -‐‑‒  Cyril  Magnin  I

Anthony  Lai  –  Oracle  (Spec  Lead)Fred  Rowe  –  IBM  

Copyright © 2012, Oracle and/or its affiliates. All rights reserved. 84 Copyright © 2013, Oracle and/or its affiliates. All rights reserved. 84

Resource

Sample  Source  Code        https://github.com/yoshioterada/                                ConcurrentUtil4EE

JSR  236  Related  Page        http://jcp.org/en/jsr/detail?id=236        https://java.net/projects/                              concurrency-‐‑‒ee-‐‑‒spec

Copyright © 2012, Oracle and/or its affiliates. All rights reserved. 85

Graphic Section Divider

Copyright © 2012, Oracle and/or its affiliates. All rights reserved. 86