Successfully reported this slideshow.
We use your LinkedIn profile and activity data to personalize ads and to show you more relevant ads. You can change your ad preferences anytime.
java.util.concurrency 
Wielowątkowość z punktu widzenia Java EE, Spring, Akka
• Ericpol Sp. z o.o. 
• Własność prywatna 
• Założona w 1991 
• Obroty 2013: 66,5 MEUR 
• Ponad 2000 pracowników w 4 kraja...
ericpol.com 
Ericpol w liczbach 
Ericpol 
w 
liczbach 
Ponad 
75 
krajów, w których 
realizowaliśmy 
projekty 
Ponad 
750 ...
ericpol.com 
Obszary biznesowe 
Bankowość 
i Finanse 
Aplikacje dla 
biznesu M2M 
Aplikacje 
medyczne 
rrrr-mm-dd 4 
Zamów...
ericpol.com 
Pokrótce omówimy 
THREAD 
JSE 
JEE 
Runnable 
Future 
Executors 
ThreadPool 
JEE 6 
JEE 7 
Components Pool 
@...
ericpol.com 
Każdy w życiu czasem chce zrobić coś dużego…
ericpol.com 
No to budujmy…
ericpol.com 
A dałoby się szybciej?
ericpol.com 
Najlepiej jakby się dało…
ericpol.com 
Ale jak to mówią… 
9 kobiet nie urodzi 
w jeden miesiąc
ericpol.com 
Potrzebna koordynacja prac
ericpol.com 
Inaczej efekt może być inny niż oczekiwany 
?
ericpol.com 
Aplikacja
ericpol.com 
Przetwarzanie żądań 
Pula wątków 
odbierających żądania
ericpol.com 
Czasami nasze niektóre zadania… 
są cięższe niż wyświetlenie buźki na ekranie….
ericpol.com 
… i potrafią przytkać system… 
Pula połączeń
ericpol.com 
… lub wyżreć całą pamięć… 
Pamięć
ericpol.com 
W oczekiwaniu na wynik
ericpol.com 
Co można poradzić 
dołożyć sprzętu? 
dołożyć pamięci?
ericpol.com 
Ograniczmy żarłoczność aplikacji
ericpol.com 
Środowisko 
§ JSE 
- w zasadzie ręczne zarządzanie wątkami 
§ JEE 
- wątki zarządzane przez serwer 
- nie z...
ericpol.com 
Dla przypomnienia 
@FunctionalInterface 
public interface Runnable { 
public abstract void run(); 
} 
public ...
public class MyThread extends Thread{ 
public MyThread() { 
super(new MyRunnable()); 
} 
} 
ericpol.com
ericpol.com 
Dla przypomnienia c.d. 
Thread thread = new Thread(new MyRunnable()); 
thread.start(); 
Thread thread = new M...
ericpol.com 
Lock 
§ Lock 
§ ReentrantLock 
§ ReentrantReadWriteLock
ericpol.com 
ThreadPool 
pula wątków 
Potraktujmy pulę wątków jak pulę połączeń. 
Spowodujemy iż określone zadanie będzie ...
ericpol.com 
ExecutorService 
ExecutorService executorService = 
Executors.newFixedThreadPool(5);
ericpol.com 
ExecutorService 
ExecutorService executorService = 
Executors.newFixedThreadPool(10); 
ExecutorService execut...
ericpol.com 
Callable<V> i Future<V> 
public interface Callable<V> { 
V call() throws Exception; 
} 
public interface Futu...
ericpol.com 
Wywołanie zadania 
ExecutorService executorService = 
Executors.newFixedThreadPool(10); 
Future<String> futur...
ericpol.com 
Zbieranie wyników 
ExecutorService executorService = 
Executors.newFixedThreadPool(5); 
CompletionService com...
ericpol.com 
ForkJoinPool 
§ Mechanizm wprowadzony w Java 7 
§ java.util.concurrent.ForkJoinPool 
§ java.util.concurren...
ericpol.com 
ForkJoinPool 
ForkJoinPool pool = new ForkJoinPool(); 
ForkJoinPool pool = new ForkJoinPool( 
Runtime.getRunt...
ericpol.com 
ForkJoinTask 
ForkJoinPool pool = new ForkJoinPool(); 
pool.execute( 
new ForkJoinTask<String>{ 
} 
); 
pool....
ericpol.com 
RecursiveTask 
class Incrementor extends RecursiveTask<Integer> { 
int theNumber; 
Incrementor(int x) { 
theN...
ericpol.com 
RecursiveTask (2) 
class Sum extends RecursiveTask<Long> { 
Sum(int[] arr, int lo, int hi) { 
array = arr; 
l...
ericpol.com 
Fork & Join 
protected Long compute() { 
if(high - low <= SEQUENTIAL_THRESHOLD) { 
long sum = 0; 
for(int i=l...
ericpol.com 
Wątki a JavaEE 
§ JavaEE <=6 Brak bezpośredniej możliwości tworzenia i 
zarządzania wątkami. 
§ Można wykor...
ericpol.com 
Sterowanie 
§ Globalne 
- pule wątków konektorów serwera 
§ Lokalne 
- pule komponentów 
- pule wątków
ericpol.com 
EJB
ericpol.com 
maxSize=5
ericpol.com 
maxSize=1
ericpol.com 
Pule komponentów EJB 
<pools> 
<bean-instance-pools> 
<strict-max-pool name="slsb-strict-max-pool" 
max-pool-...
ericpol.com 
subsystem xmlns="urn:jboss:domain:ejb3 
<session-bean> 
<stateless> 
<bean-instance-pool-ref 
pool-name="slsb...
ericpol.com 
jboss-ejb3.xml 
§ Plik pozwala na zmianę domyślnej konfiguracji kontenera ejb 
dla poszczególnych komponentó...
ericpol.com 
Przykład 
<?xml version="1.1" encoding="UTF-8"?> 
<jboss:ejb-jar xmlns:jboss="http://www.jboss.com/xml/ns/jav...
ericpol.com 
@Singleton
ericpol.com 
@Singleton
ericpol.com 
@Singleton 
@ConcurrencyManagement(CONTAINER) 
@Singleton 
public class ExampleSingletonBean { 
private Strin...
ericpol.com 
@Singleton 
@ConcurrencyManagement(CONTAINER) 
@Singleton 
@Lock(READ) 
public class ExampleSingletonBean { 
...
ericpol.com 
@Singleton 
@ConcurrencyManagement(CONTAINER) 
@Singleton 
@Lock(READ) 
@AccessTimeout(value=360000) 
public ...
ericpol.com 
Concurrency Utilities for Java EE (JSR 236) 
Application Server 
ContextService 
ManagedThreadFactory 
Manage...
ericpol.com 
Konfiguracja 
<subsystem xmlns="urn:jboss:domain:ee:2.0"> 
<concurrent> 
<context-services> 
… 
</context-ser...
public class ReportTask implements Callable<Report>{ 
public void run() { 
try { 
Thread.sleep(3000); 
} catch (Interrupte...
ericpol.com 
ContextService 
@Stateless 
public class ReportBean { 
@Resource 
private ContextService contextService; 
pub...
ericpol.com 
ManagedThreadFactory 
@Stateless 
public class ReportBean { 
@Resource( 
lookup="java:jboss/ee/concurrency/fa...
ericpol.com 
ManagedExecutorService 
@Stateless 
public class ReportBean { 
@Resource 
private ManagedExecutorService exec...
ericpol.com 
CustomExecutorService 
@Singleton 
public class ExecutorAccessor { 
private ExecutorService threadPoolExecuto...
ericpol.com 
ManagedScheduledExecutorService 
@Stateless 
public class ReportBean { 
@Resource( 
lookup= 
"java:jboss/ee/c...
ericpol.com 
JMS
ericpol.com 
JMS
ericpol.com 
JMS
Upcoming SlideShare
Loading in …5
×

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

436 views

Published on

Wielowątkowość to temat przewijający się często w aplikacjach. Czasem tworzona ręcznie, czasem przykryta przez frameworki. Omówione zostaną niektóre elementy pakietu java.util.concurrent, które można wykorzystać zarówno do implementacji wielowątkowości w swoich aplikacjach jak i bezpiecznego wykorzystywania jej w gotowych projektach opartych na gotowych frameworkach. Przyglądniemy się również sposobom wykorzystania wielowątkowości w JavaEE np w komponentach EJB.

Published in: Software
  • Be the first to comment

  • Be the first to like this

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

  1. 1. java.util.concurrency Wielowątkowość z punktu widzenia Java EE, Spring, Akka
  2. 2. • Ericpol Sp. z o.o. • Własność prywatna • Założona w 1991 • Obroty 2013: 66,5 MEUR • Ponad 2000 pracowników w 4 krajach • Siedziba: Łódź, Polska • Biura: Kraków, Warszawa ericpol.com Ericpol rrrr-mm-dd 2 • Oddziały: • Linköping, Szwecja • Lwów, Ukraina • Brześć, Białoruś • Certyfikat ISO 9001 & 14001
  3. 3. 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
  4. 4. 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
  5. 5. ericpol.com Pokrótce omówimy THREAD JSE JEE Runnable Future Executors ThreadPool JEE 6 JEE 7 Components Pool @Asynchronous ManagedExecutors ManagedThreadPools Connector Thread Pool Asynchronous
  6. 6. ericpol.com Każdy w życiu czasem chce zrobić coś dużego…
  7. 7. ericpol.com No to budujmy…
  8. 8. ericpol.com A dałoby się szybciej?
  9. 9. ericpol.com Najlepiej jakby się dało…
  10. 10. ericpol.com Ale jak to mówią… 9 kobiet nie urodzi w jeden miesiąc
  11. 11. ericpol.com Potrzebna koordynacja prac
  12. 12. ericpol.com Inaczej efekt może być inny niż oczekiwany ?
  13. 13. ericpol.com Aplikacja
  14. 14. ericpol.com Przetwarzanie żądań Pula wątków odbierających żądania
  15. 15. ericpol.com Czasami nasze niektóre zadania… są cięższe niż wyświetlenie buźki na ekranie….
  16. 16. ericpol.com … i potrafią przytkać system… Pula połączeń
  17. 17. ericpol.com … lub wyżreć całą pamięć… Pamięć
  18. 18. ericpol.com W oczekiwaniu na wynik
  19. 19. ericpol.com Co można poradzić dołożyć sprzętu? dołożyć pamięci?
  20. 20. ericpol.com Ograniczmy żarłoczność aplikacji
  21. 21. 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
  22. 22. ericpol.com Dla przypomnienia @FunctionalInterface public interface Runnable { public abstract void run(); } public class MyRunnable implements Runnable { @Override public void run() { } }
  23. 23. public class MyThread extends Thread{ public MyThread() { super(new MyRunnable()); } } ericpol.com
  24. 24. ericpol.com Dla przypomnienia c.d. Thread thread = new Thread(new MyRunnable()); thread.start(); Thread thread = new MyThread(); thread.start();
  25. 25. ericpol.com Lock § Lock § ReentrantLock § ReentrantReadWriteLock
  26. 26. 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).
  27. 27. ericpol.com ExecutorService ExecutorService executorService = Executors.newFixedThreadPool(5);
  28. 28. ericpol.com ExecutorService ExecutorService executorService = Executors.newFixedThreadPool(10); ExecutorService executorService = Executors.newCachedThreadPool( new ThreadFactory() { @Override public Thread newThread(Runnable r) { return ….. ; } } );
  29. 29. 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; }
  30. 30. 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"; } } );
  31. 31. ericpol.com Zbieranie wyników ExecutorService executorService = Executors.newFixedThreadPool(5); CompletionService completion = new ExecutorCompletionService(executorService); for(;;){ completion.take(); }
  32. 32. 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
  33. 33. ericpol.com ForkJoinPool ForkJoinPool pool = new ForkJoinPool(); ForkJoinPool pool = new ForkJoinPool( Runtime.getRuntime().availableProcessors() );
  34. 34. ericpol.com ForkJoinTask ForkJoinPool pool = new ForkJoinPool(); pool.execute( new ForkJoinTask<String>{ } ); pool.execute( ForkJoinTask.adapt(Callable<String>){ } );
  35. 35. ericpol.com RecursiveTask class Incrementor extends RecursiveTask<Integer> { int theNumber; Incrementor(int x) { theNumber = x; } public Integer compute() { return theNumber + 1; } }
  36. 36. 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() { … } }
  37. 37. 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; } }
  38. 38. 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)
  39. 39. ericpol.com Sterowanie § Globalne - pule wątków konektorów serwera § Lokalne - pule komponentów - pule wątków
  40. 40. ericpol.com EJB
  41. 41. ericpol.com maxSize=5
  42. 42. ericpol.com maxSize=1
  43. 43. 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>
  44. 44. 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>
  45. 45. 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
  46. 46. 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>
  47. 47. ericpol.com @Singleton
  48. 48. ericpol.com @Singleton
  49. 49. 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; } }
  50. 50. 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; } }
  51. 51. 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; } }
  52. 52. ericpol.com Concurrency Utilities for Java EE (JSR 236) Application Server ContextService ManagedThreadFactory ManagedExecutorService ManagedScheduledExecutorService
  53. 53. 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>
  54. 54. public class ReportTask implements Callable<Report>{ public void run() { try { Thread.sleep(3000); } catch (InterruptedException e) { } } } ericpol.com
  55. 55. 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); } }
  56. 56. 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(); } }
  57. 57. ericpol.com ManagedExecutorService @Stateless public class ReportBean { @Resource private ManagedExecutorService executorService; public void runReports() { ReportTask reportTask = new ReportTask(); Future<Report> future = executorService.submit(reportTask); } }
  58. 58. 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; } }
  59. 59. 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); } }
  60. 60. ericpol.com JMS
  61. 61. ericpol.com JMS
  62. 62. ericpol.com JMS

×