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

进程与线程

开发平台:

Java

  1. import java.util.*;
  2. public class SureStopVerbose extends Object {
  3. // nested internal class for stop request entries
  4. private static class Entry extends Object {
  5. private Thread thread;
  6. private long stopTime;
  7. private Entry(Thread t, long stop) {
  8. thread = t;
  9. stopTime = stop;
  10. }
  11. }
  12. // static reference to the singleton instance
  13. private static SureStopVerbose ss;
  14. static {
  15. // When class is loaded, create exactly one instance 
  16. // using the private constructor.
  17. ss = new SureStopVerbose();
  18. print("SureStopVerbose instance created.");
  19. }
  20. private List stopList;
  21. private List pendingList;
  22. private Thread internalThread;
  23. private SureStopVerbose() {
  24. // using a linked list for fast deletions
  25. stopList = new LinkedList();
  26. // Enough initial capacity for 20 pending additions, 
  27. // will grow automatically if necessary to keep 
  28. // ensureStop() from blocking.
  29. pendingList = new ArrayList(20);
  30. Runnable r = new Runnable() {
  31. public void run() {
  32. try {
  33. runWork();
  34. } catch ( Exception x ) {
  35. // in case ANY exception slips through
  36. x.printStackTrace(); 
  37. }
  38. }
  39. };
  40. internalThread = new Thread(r);
  41. internalThread.setDaemon(true); // no need to run alone
  42. internalThread.setPriority(Thread.MAX_PRIORITY); // high
  43. internalThread.start();
  44. }
  45. private void runWork() {
  46. try {
  47. while ( true ) {
  48. // Since this is a super-high priority thread, 
  49. // be sure to give other threads a chance to 
  50. // run each time through in case the wait on 
  51. // pendingList is very short.
  52. print("about to sleep for 0.5 seconds");
  53. Thread.sleep(500);
  54. print("done with sleep for 0.5 seconds");
  55. long sleepTime = checkStopList();
  56. print("back from checkStopList(), sleepTime=" + 
  57. sleepTime);
  58. synchronized ( pendingList ) {
  59. if ( pendingList.size() < 1 ) {
  60. print("about to wait on pendingList " +
  61. "for " + sleepTime + " ms");
  62. long start = System.currentTimeMillis();
  63. pendingList.wait(sleepTime);
  64. long elapsedTime = 
  65. System.currentTimeMillis() - start;
  66. print("waited on pendingList for " + 
  67. elapsedTime + " ms");
  68. }
  69. if ( pendingList.size() > 0 ) {
  70. // copy into stopList and then remove 
  71. // from pendingList.
  72. print("copying " + pendingList.size() + 
  73. " elements from pendingList to " +
  74. "stopList");
  75. int oldSize = stopList.size();
  76. stopList.addAll(pendingList);
  77. pendingList.clear();
  78. int newSize = stopList.size();
  79. print("pendingList.size()=" + 
  80. pendingList.size() +
  81. ", stopList grew by " + 
  82. (newSize - oldSize));
  83. }
  84. }
  85. } // while
  86. } catch ( InterruptedException x ) {
  87. // ignore
  88. } catch ( Exception x ) {
  89. // Never expect this, but print a trace in case 
  90. // it happens.
  91. x.printStackTrace();
  92. }
  93. }
  94. private long checkStopList() {
  95. print("entering checkStopList() - stopList.size()=" + 
  96. stopList.size());
  97. long currTime = System.currentTimeMillis();
  98. long minTime = Long.MAX_VALUE;
  99. Iterator iter = stopList.iterator();
  100. while ( iter.hasNext() ) {
  101. Entry entry = (Entry) iter.next();
  102. if ( entry.thread.isAlive() ) {
  103. print("thread is alive - " + 
  104. entry.thread.getName());
  105. if ( entry.stopTime < currTime ) {
  106. // timed out, stop it abruptly right now
  107. print("timed out, stopping - " + 
  108. entry.thread.getName());
  109. try {
  110. entry.thread.stop();
  111. } catch ( SecurityException x ) {
  112. // Catch this here so that other 
  113. // operations are not disrupted. Warn 
  114. // that thread could not be stopped.
  115. System.err.println(
  116. "SureStop was not permitted to " +
  117. "stop thread=" + entry.thread);
  118. x.printStackTrace();
  119. }
  120. // Since it's stopped, remove it 
  121. // from stopList.
  122. iter.remove();
  123. } else {
  124. // Not yet expired, check to see if this 
  125. // is the new minimum.
  126. minTime = Math.min(entry.stopTime, minTime);
  127. print("new minTime=" + minTime);
  128. }
  129. } else {
  130. print("thread died on its own - " + 
  131. entry.thread.getName());
  132. // Thread died on its own, remove it from 
  133. // stopList.
  134. iter.remove();
  135. } // if alive
  136. } // while
  137. long sleepTime = minTime - System.currentTimeMillis();
  138. // ensure that it is a least a little bit of time
  139. sleepTime = Math.max(50, sleepTime); 
  140. print("leaving checkStopList() - stopList.size()=" + 
  141. stopList.size());
  142. return sleepTime;
  143. }
  144. private void addEntry(Entry entry) {
  145. synchronized ( pendingList ) {
  146. pendingList.add(entry);
  147. // no need for notifyAll(), one waiter
  148. pendingList.notify(); 
  149. print("added entry to pendingList, name=" + 
  150. entry.thread.getName() + 
  151. ", stopTime=" + entry.stopTime + ", in " + 
  152. ( entry.stopTime - System.currentTimeMillis() ) +
  153. " ms");
  154. }
  155. }
  156. public static void ensureStop(Thread t, long msGracePeriod) {
  157. print("entering ensureStop() - name=" + t.getName() +
  158. ", msGracePeriod=" + msGracePeriod);
  159. if ( !t.isAlive() ) {
  160. // thread is already stopped, return right away
  161. print("already stopped, not added to list - " + 
  162. t.getName());
  163. return;
  164. }
  165. long stopTime = 
  166. System.currentTimeMillis() + msGracePeriod;
  167. Entry entry = new Entry(t, stopTime);
  168. ss.addEntry(entry);
  169. print("leaving ensureStop() - name=" + t.getName());
  170. }
  171. private static void print(String msg) {
  172. Thread t = Thread.currentThread();
  173. String name = t.getName();
  174. if ( t == ss.internalThread ) {
  175. name = "SureStopThread";
  176. }
  177. System.out.println(name + ": " + msg);
  178. }
  179. }