Advertisement
Guest User

Untitled

a guest
May 27th, 2017
60
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 2.26 KB | None | 0 0
  1. package com.paramsen.testground.test_concurrent_download;
  2.  
  3. import java.util.ArrayList;
  4. import java.util.List;
  5. import java.util.Stack;
  6.  
  7. /**
  8. * Concurrently download from predefined list of urls on a predefined amount of worker threads.
  9. * Workers execute requests until the Stack is depleted in a synchronized manor, since Stack
  10. * is synchronized in Java.
  11. *
  12. * @author Pär Amsen 05/2017
  13. */
  14. public class ConcurrentRequestSource {
  15. public static final int WORKERS = 4;
  16.  
  17. /**
  18. * @param callback is a callback that will be called with each work result when available
  19. */
  20. public void download(Stack<String> urls, Callback<String> callback) {
  21. newWorkers(urls, callback).forEach(Thread::start);
  22. }
  23.  
  24. private List<Thread> newWorkers(Stack<String> urls, Callback<String> callback) {
  25. ArrayList<Thread> workers = new ArrayList<>();
  26.  
  27. for (int i = 0; i < WORKERS; i++) {
  28. workers.add(new Thread(newWorker(urls, callback), "ConcurrentRequestSourceWorker-" + i));
  29. }
  30.  
  31. return workers;
  32. }
  33.  
  34. private Runnable newWorker(Stack<String> urls, Callback<String> callback) {
  35. return () -> {
  36. while (!urls.empty()) {
  37. callback.call(doRequest(urls.pop()));
  38. }
  39.  
  40. System.out.println(String.format("Thread %s done", Thread.currentThread().getName()));
  41. };
  42. }
  43.  
  44. private String doRequest(String url) {
  45. try {
  46. Thread.sleep(10); //mock request time
  47. } catch (InterruptedException e) {
  48. //ignore
  49. }
  50.  
  51. System.out.printf("Downloaded %s on thread: %s%n", url, Thread.currentThread().getName());
  52.  
  53. return "path to download from " + url;
  54. }
  55.  
  56. interface Callback<T> {
  57. void call(T t);
  58. }
  59. }
  60.  
  61.  
  62.  
  63. /**
  64. * Unit test
  65. *
  66. * @author Pär Amsen 05/2017
  67. */
  68. public class ConcurrentRequestSourceTest {
  69. @Test
  70. public void download() throws Exception {
  71. List<String> results = new ArrayList<>();
  72. Stack<String> data = new Stack<>();
  73.  
  74. for (int i = 0; i < 2000; i++) {
  75. data.add(String.valueOf(i));
  76. }
  77.  
  78. new ConcurrentRequestSource().download(data, results::add);
  79.  
  80. while (results.size() < 2000) {
  81. Thread.sleep(10);
  82. }
  83.  
  84. assertEquals(2000, results.size());
  85. }
  86. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement