MultipleCorePrimeTest.java 2.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778
  1. import java.util.ArrayList;
  2. import java.util.List;
  3. import java.util.concurrent.Callable;
  4. import java.util.concurrent.ExecutionException;
  5. import java.util.concurrent.ExecutorService;
  6. import java.util.concurrent.Executors;
  7. import java.util.concurrent.FutureTask;
  8. import java.util.concurrent.TimeUnit;
  9. import java.util.concurrent.TimeoutException;
  10. public class MultipleCorePrimeTest {
  11. public static void count(int target, int threads)
  12. throws InterruptedException, TimeoutException {
  13. ExecutorService executor =
  14. Executors.newFixedThreadPool(threads);
  15. List<FutureTask<Integer>> taskList =
  16. new ArrayList<FutureTask<Integer>>();
  17. long startTime = System.currentTimeMillis();
  18. for (int i = 1; i <= threads; ++i) {
  19. int ilen = target / threads;
  20. /* Test following intervall for primes */
  21. final int start = (i - 1) * ilen;
  22. final int end = (i != threads)
  23. ? i * ilen - 1
  24. : target;
  25. FutureTask<Integer> task =
  26. new FutureTask<Integer>(
  27. new Callable<Integer>() {
  28. @Override
  29. public Integer call() {
  30. int count = 0;
  31. for (int i = start; i <= end;
  32. ++i) {
  33. if (SingleCorePrimeTest.
  34. isPrime(i))
  35. ++count;
  36. }
  37. return count;
  38. }
  39. });
  40. taskList.add(task);
  41. executor.submit(task);
  42. }
  43. executor.shutdown();
  44. if (!executor.awaitTermination(10,
  45. TimeUnit.MINUTES)) {
  46. throw new TimeoutException();
  47. }
  48. final long endTime = System.currentTimeMillis();
  49. int count = 0;
  50. for (int i = 0; i < taskList.size(); ++i) {
  51. try {
  52. count += taskList.get(i).get();
  53. } catch (InterruptedException e) {
  54. e.printStackTrace();
  55. } catch (ExecutionException e) {
  56. e.printStackTrace();
  57. }
  58. }
  59. System.out.println(threads + " thread: "
  60. + (endTime - startTime) + " ms");
  61. }
  62. public static void main(String[] args) {
  63. final int target = 100_000_000;
  64. try {
  65. count(target, 1);
  66. count(target, 2);
  67. count(target, 4);
  68. count(target, 8);
  69. } catch (Exception e) {
  70. e.printStackTrace();
  71. }
  72. }
  73. }