PriorityCompete.java
上传用户:songled
上传日期:2022-07-14
资源大小:94k
文件大小:3k
源码类别:

进程与线程

开发平台:

Java

  1. public class PriorityCompete extends Object {
  2. private volatile int count;
  3. private boolean yield;
  4. private Thread internalThread;
  5. private volatile boolean noStopRequested;
  6. public PriorityCompete(
  7. String name, 
  8. int priority, 
  9. boolean yield
  10. ) {
  11. count = 0;
  12. this.yield = yield;
  13. noStopRequested = true;
  14. Runnable r = new Runnable() {
  15. public void run() {
  16. try {
  17. runWork();
  18. } catch ( Exception x ) {
  19. // in case ANY exception slips through
  20. x.printStackTrace(); 
  21. }
  22. }
  23. };
  24. internalThread = new Thread(r, name);
  25. internalThread.setPriority(priority);
  26. }
  27. private void runWork() {
  28. Thread.yield();
  29. while ( noStopRequested ) {
  30. if ( yield ) {
  31. Thread.yield();
  32. }
  33. count++;
  34. for ( int i = 0; i < 1000; i++ ) {
  35. double x = i * Math.PI / Math.E;
  36. }
  37. }
  38. }
  39. public void startRequest() {
  40. internalThread.start();
  41. }
  42. public void stopRequest() {
  43. noStopRequested = false;
  44. }
  45. public int getCount() {
  46. return count;
  47. }
  48. public String getNameAndPriority() {
  49. return internalThread.getName() + 
  50. ": priority=" + internalThread.getPriority();
  51. }
  52. private static void runSet(boolean yield) {
  53. PriorityCompete[] pc = new PriorityCompete[3];
  54. pc[0] = new PriorityCompete("PC0", 3, yield);
  55. pc[1] = new PriorityCompete("PC1", 6, yield);
  56. pc[2] = new PriorityCompete("PC2", 6, yield);
  57. // let the dust settle for a bit before starting them up
  58. try { Thread.sleep(1000); } 
  59. catch ( InterruptedException x ) { }
  60. for ( int i = 0; i < pc.length; i++ ) {
  61. pc[i].startRequest();
  62. }
  63. long startTime = System.currentTimeMillis();
  64. try { Thread.sleep(10000); } 
  65. catch ( InterruptedException x ) { }
  66. for ( int i = 0; i < pc.length; i++ ) {
  67. pc[i].stopRequest();
  68. }
  69. long stopTime = System.currentTimeMillis();
  70. // let things settle down again
  71. try { Thread.sleep(1000); } 
  72. catch ( InterruptedException x ) { }
  73. int totalCount = 0;
  74. for ( int i = 0; i < pc.length; i++ ) {
  75. totalCount += pc[i].getCount();
  76. }
  77. System.out.println("totalCount=" + totalCount +
  78. ", count/ms=" + roundTo(((double) totalCount) / 
  79. (stopTime - startTime), 3));
  80. for ( int i = 0; i < pc.length; i++ ) {
  81. double perc = roundTo(100.0 * pc[i].getCount() / 
  82. totalCount, 2);
  83. System.out.println(pc[i].getNameAndPriority() + 
  84. ", " + perc + "%, count=" + pc[i].getCount());
  85. }
  86. }
  87. public static double roundTo(double val, int places) {
  88. double factor = Math.pow(10, places);
  89. return ( (int) ( ( val * factor ) + 0.5 ) ) / factor;
  90. }
  91. public static void main(String[] args) {
  92. Runnable r = new Runnable() {
  93. public void run() {
  94. System.out.println(
  95. "Run without using yield()");
  96. System.out.println(
  97. "=========================");
  98. runSet(false);
  99. System.out.println();
  100. System.out.println("Run using yield()");
  101. System.out.println("=================");
  102. runSet(true);
  103. }
  104. };
  105. Thread t = new Thread(r, "PriorityCompete");
  106. t.setPriority(Thread.MAX_PRIORITY - 1);
  107. t.start();
  108. }
  109. }