Download - JDD2014: JAVA.util.concurrent czyli wielowątkowość z różnych perspektyw, tych mniejszych i tych enterprise - Tomasz Łabuz

Transcript
Page 1: JDD2014: JAVA.util.concurrent czyli wielowątkowość z różnych perspektyw, tych mniejszych i tych enterprise - Tomasz Łabuz

java.util.concurrency

Wielowątkowość z punktu widzenia Java EE, Spring, Akka

Page 2: JDD2014: JAVA.util.concurrent czyli wielowątkowość z różnych perspektyw, tych mniejszych i tych enterprise - Tomasz Łabuz

ericpol.com

Ericpol

rrrr-mm-dd 2

•  Ponad 2000 pracowników w 4 krajach

•  Ericpol Sp. z o.o. •  Własność prywatna •  Założona w 1991

•  Obroty 2013: 66,5 MEUR

•  Oddziały: •  Linköping, Szwecja •  Lwów, Ukraina •  Brześć, Białoruś

•  Certyfikat ISO 9001 & 14001

•  Siedziba: Łódź, Polska •  Biura: Kraków, Warszawa

Page 3: JDD2014: JAVA.util.concurrent czyli wielowątkowość z różnych perspektyw, tych mniejszych i tych enterprise - Tomasz Łabuz

ericpol.com

Ericpol w liczbach

Ericpol w

liczbach

Ponad

75 krajów, w których

realizowaliśmy projekty

Ponad

750 zrealizowanych

projektów

Ponad

2 mld ludzi korzystających ze współtworzonego

przez nas oprogramowania

Ponad

1mln samochodów z naszym

oprogramowaniem

rrrr-mm-dd 3

Page 4: JDD2014: JAVA.util.concurrent czyli wielowątkowość z różnych perspektyw, tych mniejszych i tych enterprise - Tomasz Łabuz

ericpol.com

Obszary biznesowe

Bankowość i Finanse

Aplikacje dla biznesu M2M

Aplikacje medyczne

rrrr-mm-dd 4

Zamówienia publiczne

§  Integracja

§  Rozwiązania

dedykowane

§  E-usługi

§  Obieg

dokumentów

§  Wynajem kadry

§  Utrzymanie

i rozwój

oprogramowania

§  Rozwiązania

dedykowane

§  Wdrożenia

oprogramowania

§  Szkolenia

§  Wdrożenia

§  Rozwój

§  Kastomizacja

§  Dedykowane

rozwiązania IT

§  Utrzymanie

§  Szkolenia

§  Konsulting

§  Konsulting

§  Migracja

§  Wynajem kadry

§  Integracja

§  Rozwój

oprogramowania

§  Utrzymanie

§  Rozwiązania

własne: drEryk,

erLab, aplikacje

mobilne

§  Kastomizacja

§  Szkolenia

Telekomunikacja

§  Wynajem kadry

§  Konsulting

§  Kastomizacja

§  Rozwiązania

dedykowane

§  Szkolenia

§  Integracja

§  Rozwój

Page 5: JDD2014: JAVA.util.concurrent czyli wielowątkowość z różnych perspektyw, tych mniejszych i tych enterprise - Tomasz Łabuz

ericpol.com

Pokrótce omówimy

THREAD

JSE

JEE

Runnable

Future

Executors

ThreadPool

JEE 6

JEE 7

@Asynchronous

Components Pool

ManagedExecutors

ManagedThreadPools

Connector Thread Pool

Asynchronous

Page 6: JDD2014: JAVA.util.concurrent czyli wielowątkowość z różnych perspektyw, tych mniejszych i tych enterprise - Tomasz Łabuz

ericpol.com

Każdy w życiu czasem chce zrobić coś dużego…

Page 7: JDD2014: JAVA.util.concurrent czyli wielowątkowość z różnych perspektyw, tych mniejszych i tych enterprise - Tomasz Łabuz

ericpol.com

No to budujmy…

Page 8: JDD2014: JAVA.util.concurrent czyli wielowątkowość z różnych perspektyw, tych mniejszych i tych enterprise - Tomasz Łabuz

ericpol.com

A dałoby się szybciej?

Page 9: JDD2014: JAVA.util.concurrent czyli wielowątkowość z różnych perspektyw, tych mniejszych i tych enterprise - Tomasz Łabuz

ericpol.com

Najlepiej jakby się dało…

Page 10: JDD2014: JAVA.util.concurrent czyli wielowątkowość z różnych perspektyw, tych mniejszych i tych enterprise - Tomasz Łabuz

ericpol.com

Ale jak to mówią…

9 kobiet nie urodzi w jeden miesiąc

Page 11: JDD2014: JAVA.util.concurrent czyli wielowątkowość z różnych perspektyw, tych mniejszych i tych enterprise - Tomasz Łabuz

ericpol.com

Potrzebna koordynacja prac

Page 12: JDD2014: JAVA.util.concurrent czyli wielowątkowość z różnych perspektyw, tych mniejszych i tych enterprise - Tomasz Łabuz

ericpol.com

Inaczej efekt może być inny niż oczekiwany

?

Page 13: JDD2014: JAVA.util.concurrent czyli wielowątkowość z różnych perspektyw, tych mniejszych i tych enterprise - Tomasz Łabuz

ericpol.com

Aplikacja

Page 14: JDD2014: JAVA.util.concurrent czyli wielowątkowość z różnych perspektyw, tych mniejszych i tych enterprise - Tomasz Łabuz

ericpol.com

Przetwarzanie żądań

Pula wątków odbierających żądania

Page 15: JDD2014: JAVA.util.concurrent czyli wielowątkowość z różnych perspektyw, tych mniejszych i tych enterprise - Tomasz Łabuz

ericpol.com

Czasami nasze niektóre zadania…

są cięższe niż wyświetlenie buźki na ekranie….

Page 16: JDD2014: JAVA.util.concurrent czyli wielowątkowość z różnych perspektyw, tych mniejszych i tych enterprise - Tomasz Łabuz

ericpol.com

… i potrafią przytkać system…

Pula połączeń

Page 17: JDD2014: JAVA.util.concurrent czyli wielowątkowość z różnych perspektyw, tych mniejszych i tych enterprise - Tomasz Łabuz

ericpol.com

… lub wyżreć całą pamięć…

Pamięć

Page 18: JDD2014: JAVA.util.concurrent czyli wielowątkowość z różnych perspektyw, tych mniejszych i tych enterprise - Tomasz Łabuz

ericpol.com

W oczekiwaniu na wynik

Page 19: JDD2014: JAVA.util.concurrent czyli wielowątkowość z różnych perspektyw, tych mniejszych i tych enterprise - Tomasz Łabuz

ericpol.com

Co można poradzić

dołożyć sprzętu?

dołożyć pamięci?

Page 20: JDD2014: JAVA.util.concurrent czyli wielowątkowość z różnych perspektyw, tych mniejszych i tych enterprise - Tomasz Łabuz

ericpol.com

Ograniczmy żarłoczność aplikacji

Page 21: JDD2014: JAVA.util.concurrent czyli wielowątkowość z różnych perspektyw, tych mniejszych i tych enterprise - Tomasz Łabuz

ericpol.com

Środowisko

§  JSE -  w zasadzie ręczne zarządzanie wątkami

§  JEE -  wątki zarządzane przez serwer -  nie zalecane ręczne uruchamianie wątków

-  nowe elementy w JEE 7

Page 22: JDD2014: JAVA.util.concurrent czyli wielowątkowość z różnych perspektyw, tych mniejszych i tych enterprise - Tomasz Łabuz

ericpol.com

Dla przypomnienia

@FunctionalInterface public interface Runnable {

public abstract void run();

}

public class MyRunnable implements Runnable {

@Override public void run() {

}

}

Page 23: JDD2014: JAVA.util.concurrent czyli wielowątkowość z różnych perspektyw, tych mniejszych i tych enterprise - Tomasz Łabuz

ericpol.com

public class MyThread extends Thread{

public MyThread() {

super(new MyRunnable()); }

}

Page 24: JDD2014: JAVA.util.concurrent czyli wielowątkowość z różnych perspektyw, tych mniejszych i tych enterprise - Tomasz Łabuz

ericpol.com

Dla przypomnienia c.d.

Thread thread = new Thread(new MyRunnable());

thread.start();

Thread thread = new MyThread();

thread.start();

Page 25: JDD2014: JAVA.util.concurrent czyli wielowątkowość z różnych perspektyw, tych mniejszych i tych enterprise - Tomasz Łabuz

ericpol.com

Lock

§  Lock §  ReentrantLock

§  ReentrantReadWriteLock

Page 26: JDD2014: JAVA.util.concurrent czyli wielowątkowość z różnych perspektyw, tych mniejszych i tych enterprise - Tomasz Łabuz

ericpol.com

ThreadPool

pula wątków

Potraktujmy pulę wątków jak pulę połączeń. Spowodujemy iż określone zadanie będzie przeprowadzane tylko przez określoną ilość wątków. Dzięki temu zapanujemy np. nad zużyciem pamięci i zablokujemy nadmierną pazerność aplikacji (jeśli takowa istnieje).

Page 27: JDD2014: JAVA.util.concurrent czyli wielowątkowość z różnych perspektyw, tych mniejszych i tych enterprise - Tomasz Łabuz

ericpol.com

ExecutorService

ExecutorService executorService = Executors.newFixedThreadPool(5);

Page 28: JDD2014: JAVA.util.concurrent czyli wielowątkowość z różnych perspektyw, tych mniejszych i tych enterprise - Tomasz Łabuz

ericpol.com

ExecutorService

ExecutorService executorService = Executors.newFixedThreadPool(10);

ExecutorService executorService =

Executors.newCachedThreadPool( new ThreadFactory() {

@Override public Thread newThread(Runnable r) { return ….. ; }

} );

Page 29: JDD2014: JAVA.util.concurrent czyli wielowątkowość z różnych perspektyw, tych mniejszych i tych enterprise - Tomasz Łabuz

ericpol.com

Callable<V> i Future<V>

public interface Callable<V> { V call() throws Exception; } public interface Future<V> {

boolean cancel(boolean mayInterruptIfRunning); boolean isCancelled(); boolean isDone(); V get() throws InterruptedException, ExecutionException; V get(long timeout, TimeUnit unit) throws InterruptedException, ExecutionException, TimeoutException;

}

Page 30: JDD2014: JAVA.util.concurrent czyli wielowątkowość z różnych perspektyw, tych mniejszych i tych enterprise - Tomasz Łabuz

ericpol.com

Wywołanie zadania

ExecutorService executorService = Executors.newFixedThreadPool(10);

Future<String> future =

executorService.submit( new Callable<String>() { @Override public String call() throws Exception { executorService.invoke();

return "TEST"; }

} );

Page 31: JDD2014: JAVA.util.concurrent czyli wielowątkowość z różnych perspektyw, tych mniejszych i tych enterprise - Tomasz Łabuz

ericpol.com

Zbieranie wyników

ExecutorService executorService = Executors.newFixedThreadPool(5);

CompletionService completion = new

ExecutorCompletionService(executorService); for(;;){

completion.take(); }

Page 32: JDD2014: JAVA.util.concurrent czyli wielowątkowość z różnych perspektyw, tych mniejszych i tych enterprise - Tomasz Łabuz

ericpol.com

ForkJoinPool

§  Mechanizm wprowadzony w Java 7

§  java.util.concurrent.ForkJoinPool

§  java.util.concurrent.ForkJoinTask<V> §  java.util.concurrent.RecursiveTask<V>

§  java.util.concurrent.RecursiveAction

Page 33: JDD2014: JAVA.util.concurrent czyli wielowątkowość z różnych perspektyw, tych mniejszych i tych enterprise - Tomasz Łabuz

ericpol.com

ForkJoinPool

ForkJoinPool pool = new ForkJoinPool();

ForkJoinPool pool = new ForkJoinPool(

Runtime.getRuntime().availableProcessors() );

Page 34: JDD2014: JAVA.util.concurrent czyli wielowątkowość z różnych perspektyw, tych mniejszych i tych enterprise - Tomasz Łabuz

ericpol.com

ForkJoinTask

ForkJoinPool pool = new ForkJoinPool();

pool.execute(

new ForkJoinTask<String>{

} );

pool.execute(

ForkJoinTask.adapt(Callable<String>){

} );

Page 35: JDD2014: JAVA.util.concurrent czyli wielowątkowość z różnych perspektyw, tych mniejszych i tych enterprise - Tomasz Łabuz

ericpol.com

RecursiveTask

class Incrementor extends RecursiveTask<Integer> { int theNumber;

Incrementor(int x) {

theNumber = x; }

public Integer compute() { return theNumber + 1;

}

}

Page 36: JDD2014: JAVA.util.concurrent czyli wielowątkowość z różnych perspektyw, tych mniejszych i tych enterprise - Tomasz Łabuz

ericpol.com

RecursiveTask (2)

class Sum extends RecursiveTask<Long> {

Sum(int[] arr, int lo, int hi) {

array = arr; low = lo;

high = hi; }

protected Long compute() { …

}

}

Page 37: JDD2014: JAVA.util.concurrent czyli wielowątkowość z różnych perspektyw, tych mniejszych i tych enterprise - Tomasz Łabuz

ericpol.com

Fork & Join

protected Long compute() {

if(high - low <= SEQUENTIAL_THRESHOLD) { long sum = 0;

for(int i=low; i < high; ++i)

sum += array[i];

return sum;

} else {

int mid = low + (high - low) / 2;

Sum left = new Sum(array, low, mid);

Sum right = new Sum(array, mid, high); left.fork();

long rightAns = right.compute();

long leftAns = left.join();

return leftAns + rightAns;

}

}

Page 38: JDD2014: JAVA.util.concurrent czyli wielowątkowość z różnych perspektyw, tych mniejszych i tych enterprise - Tomasz Łabuz

ericpol.com

Wątki a JavaEE

§  JavaEE <=6 Brak bezpośredniej możliwości tworzenia i zarządzania wątkami.

§  Można wykorzystać niestandardowe mechanizmy serwerów w zakresie konfiguracji -  JMS -  Pule wątków (connector HTTP) -  Pule komponentów (EJB) -  @Singleton

§  Java EE 7 -  Concurrency Utilities for Java EE (JSR 236)

Page 39: JDD2014: JAVA.util.concurrent czyli wielowątkowość z różnych perspektyw, tych mniejszych i tych enterprise - Tomasz Łabuz

ericpol.com

Sterowanie

§  Globalne -  pule wątków konektorów serwera

§  Lokalne -  pule komponentów -  pule wątków

Page 40: JDD2014: JAVA.util.concurrent czyli wielowątkowość z różnych perspektyw, tych mniejszych i tych enterprise - Tomasz Łabuz

ericpol.com

EJB

Page 41: JDD2014: JAVA.util.concurrent czyli wielowątkowość z różnych perspektyw, tych mniejszych i tych enterprise - Tomasz Łabuz

ericpol.com

maxSize=5

Page 42: JDD2014: JAVA.util.concurrent czyli wielowątkowość z różnych perspektyw, tych mniejszych i tych enterprise - Tomasz Łabuz

ericpol.com

maxSize=1

Page 43: JDD2014: JAVA.util.concurrent czyli wielowątkowość z różnych perspektyw, tych mniejszych i tych enterprise - Tomasz Łabuz

ericpol.com

Pule komponentów EJB

<pools>

<bean-instance-pools>

<strict-max-pool name="slsb-strict-max-pool"

max-pool-size="20"

instance-acquisition-timeout="5"

instance-acquisition-timeout-unit="MINUTES"/>

<strict-max-pool name="mdb-strict-max-pool"

max-pool-size="20" instance-acquisition-timeout="5"

instance-acquisition-timeout-unit="MINUTES"/>

</bean-instance-pools>

</pools>

Page 44: JDD2014: JAVA.util.concurrent czyli wielowątkowość z różnych perspektyw, tych mniejszych i tych enterprise - Tomasz Łabuz

ericpol.com

subsystem xmlns="urn:jboss:domain:ejb3

<session-bean> <stateless>

<bean-instance-pool-ref

pool-name="slsb-strict-max-pool"/> </stateless>

</session-bean>

<mdb>

<bean-instance-pool-ref pool-name="mdb-strict-max-pool"/>

</mdb>

Page 45: JDD2014: JAVA.util.concurrent czyli wielowątkowość z różnych perspektyw, tych mniejszych i tych enterprise - Tomasz Łabuz

ericpol.com

jboss-ejb3.xml

§  Plik pozwala na zmianę domyślnej konfiguracji kontenera ejb dla poszczególnych komponentów wdrażanych w ramach aplikacji.

§  Konfiguracja może wykorzystywać ustawienia z zakresu namespace m.in. -  urn:clustering

-  urn:security -  urn:iiop -  urn:ejb-pool -  urn:ejb-cache

Page 46: JDD2014: JAVA.util.concurrent czyli wielowątkowość z różnych perspektyw, tych mniejszych i tych enterprise - Tomasz Łabuz

ericpol.com

Przykład

<?xml version="1.1" encoding="UTF-8"?> <jboss:ejb-jar xmlns:jboss="http://www.jboss.com/xml/ns/javaee" …>

<assembly-descriptor> <p:pool>

<ejb-name>*</ejb-name> <p:bean-instance-pool-ref>test</p:bean-instance-pool-ref>

</p:pool>

</assembly-descriptor>

</jboss:ejb-jar>

Page 47: JDD2014: JAVA.util.concurrent czyli wielowątkowość z różnych perspektyw, tych mniejszych i tych enterprise - Tomasz Łabuz

ericpol.com

@Singleton

Page 48: JDD2014: JAVA.util.concurrent czyli wielowątkowość z różnych perspektyw, tych mniejszych i tych enterprise - Tomasz Łabuz

ericpol.com

@Singleton

Page 49: JDD2014: JAVA.util.concurrent czyli wielowątkowość z różnych perspektyw, tych mniejszych i tych enterprise - Tomasz Łabuz

ericpol.com

@Singleton

@ConcurrencyManagement(CONTAINER) @Singleton public class ExampleSingletonBean {

private String state;

@Lock(READ) public String getState() {

return state;

}

@Lock(WRITE) public void setState(String newState) {

state = newState;

}

}

Page 50: JDD2014: JAVA.util.concurrent czyli wielowątkowość z różnych perspektyw, tych mniejszych i tych enterprise - Tomasz Łabuz

ericpol.com

@Singleton

@ConcurrencyManagement(CONTAINER) @Singleton @Lock(READ) public class ExampleSingletonBean {

private String state;

public String getState() {

return state;

}

@Lock(WRITE) public void setState(String newState) {

state = newState;

}

}

Page 51: JDD2014: JAVA.util.concurrent czyli wielowątkowość z różnych perspektyw, tych mniejszych i tych enterprise - Tomasz Łabuz

ericpol.com

@Singleton

@ConcurrencyManagement(CONTAINER) @Singleton @Lock(READ) @AccessTimeout(value=360000) public class ExampleSingletonBean {

private String state;

public String getState() {

return state;

}

@Lock(WRITE) public void setState(String newState) {

state = newState;

}

}

Page 52: JDD2014: JAVA.util.concurrent czyli wielowątkowość z różnych perspektyw, tych mniejszych i tych enterprise - Tomasz Łabuz

ericpol.com

Concurrency Utilities for Java EE (JSR 236)

Application Server

ManagedExecutorService

ManagedScheduledExecutorService

ContextService

ManagedThreadFactory

Page 53: JDD2014: JAVA.util.concurrent czyli wielowątkowość z różnych perspektyw, tych mniejszych i tych enterprise - Tomasz Łabuz

ericpol.com

Konfiguracja

<subsystem xmlns="urn:jboss:domain:ee:2.0">

<concurrent> <context-services>

</context-services>

<managed-thread-factories>

</managed-thread-factories>

<managed-executor-services>

… </managed-executor-services>

<managed-scheduled-executor-services>

</managed-scheduled-executor-services>

</concurrent>

</subsystem>

Page 54: JDD2014: JAVA.util.concurrent czyli wielowątkowość z różnych perspektyw, tych mniejszych i tych enterprise - Tomasz Łabuz

ericpol.com

public class ReportTask implements Callable<Report>{

public void run() {

try {

Thread.sleep(3000); } catch (InterruptedException e) {

} }

}

Page 55: JDD2014: JAVA.util.concurrent czyli wielowątkowość z różnych perspektyw, tych mniejszych i tych enterprise - Tomasz Łabuz

ericpol.com

ContextService

@Stateless public class ReportBean {

@Resource private ContextService contextService;

public void runReports() {

ReportTask reportTask = new ReportTask();

Callable<Report> report = contextService.

createContextualProxy( new ReportTask(), Callable.class); }

}

Page 56: JDD2014: JAVA.util.concurrent czyli wielowątkowość z różnych perspektyw, tych mniejszych i tych enterprise - Tomasz Łabuz

ericpol.com

ManagedThreadFactory

@Stateless public class ReportBean {

@Resource(

lookup="java:jboss/ee/concurrency/factory/MyManagedThreadFactory")

private ManagedThreadFactory threadFactory;

public void runReports() {

ReportTask reportTask = new ReportTask();

Thread thread = threadFactory.newThread(reportTask); thread.start();

}

}

Page 57: JDD2014: JAVA.util.concurrent czyli wielowątkowość z różnych perspektyw, tych mniejszych i tych enterprise - Tomasz Łabuz

ericpol.com

ManagedExecutorService

@Stateless public class ReportBean {

@Resource private ManagedExecutorService executorService;

public void runReports() {

ReportTask reportTask = new ReportTask();

Future<Report> future = executorService.submit(reportTask);

} }

Page 58: JDD2014: JAVA.util.concurrent czyli wielowątkowość z różnych perspektyw, tych mniejszych i tych enterprise - Tomasz Łabuz

ericpol.com

CustomExecutorService

@Singleton public class ExecutorAccessor { private ExecutorService threadPoolExecutor = null;

@Resource(name="concurrent/ThreadFactory")

ManagedThreadFactory threadFactory;

@PostConstruct public void postConstruct() {

threadPoolExecutor = new ThreadPoolExecutor(5, 10, 5, TimeUnit.SECONDS,

new ArrayBlockingQueue<Runnable>(10), threadFactory); }

public ExecutorService getThreadPool() {

return threadPoolExecutor;

}

}

Page 59: JDD2014: JAVA.util.concurrent czyli wielowątkowość z różnych perspektyw, tych mniejszych i tych enterprise - Tomasz Łabuz

ericpol.com

ManagedScheduledExecutorService

@Stateless public class ReportBean {

@Resource(

lookup=

"java:jboss/ee/concurrency/scheduler/MyScheduledExectutorService")

private ManagedScheduledExecutorService executorService;

public void runReports() {

ReportTask reportTask = new ReportTask(); executorService.scheduleAtFixedRate(reportTask, 0L, 1L, TimeUnit.HOURS);

}

}

Page 60: JDD2014: JAVA.util.concurrent czyli wielowątkowość z różnych perspektyw, tych mniejszych i tych enterprise - Tomasz Łabuz

ericpol.com

JMS

Page 61: JDD2014: JAVA.util.concurrent czyli wielowątkowość z różnych perspektyw, tych mniejszych i tych enterprise - Tomasz Łabuz

ericpol.com

JMS

Page 62: JDD2014: JAVA.util.concurrent czyli wielowątkowość z różnych perspektyw, tych mniejszych i tych enterprise - Tomasz Łabuz

ericpol.com

JMS