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

进程与线程

开发平台:

Java

  1. import java.io.*;
  2. import java.util.*;
  3. public class ExceptionCallback extends Object {
  4. private Set exceptionListeners;
  5. private Thread internalThread;
  6. private volatile boolean noStopRequested;
  7. public ExceptionCallback(ExceptionListener[] initialGroup) {
  8. init(initialGroup);
  9. }
  10. public ExceptionCallback(ExceptionListener initialListener) {
  11. ExceptionListener[] group = new ExceptionListener[1];
  12. group[0] = initialListener;
  13. init(group);
  14. }
  15. public ExceptionCallback() {
  16. init(null);
  17. }
  18. private void init(ExceptionListener[] initialGroup) {
  19. System.out.println("in constructor - initializing...");
  20. exceptionListeners = 
  21. Collections.synchronizedSet(new HashSet());
  22. // If any listeners should be added before the internal
  23. // thread starts, add them now.
  24. if ( initialGroup != null ) {
  25. for ( int i = 0; i < initialGroup.length; i++ ) {
  26. addExceptionListener(initialGroup[i]);
  27. }
  28. }
  29. // Just before returning from the constructor, 
  30. // the thread should be created and started.
  31. noStopRequested = true;
  32. Runnable r = new Runnable() {
  33. public void run() {
  34. try {
  35. runWork();
  36. } catch ( Exception x ) {
  37. // in case ANY exception slips through
  38. sendException(x);
  39. }
  40. }
  41. };
  42. internalThread = new Thread(r);
  43. internalThread.start();
  44. }
  45. private void runWork() {
  46. try {
  47. makeConnection(); // will throw an IOException
  48. } catch ( IOException x ) {
  49. sendException(x);
  50. // Probably in a real scenario, a "return" 
  51. // statement should be here.
  52. String str = null;
  53. int len = determineLength(str); // NullPointerException
  54. }
  55. private void makeConnection() throws IOException {
  56. // A NumberFormatException will be thrown when
  57. // this String is parsed.
  58. String portStr = "j20"; 
  59. int port = 0;
  60. try {
  61. port = Integer.parseInt(portStr);
  62. } catch ( NumberFormatException x ) {
  63. sendException(x);
  64. port = 80; // use default;
  65. connectToPort(port); // will throw an IOException
  66. }
  67. private void connectToPort(int portNum) throws IOException {
  68. throw new IOException("connection refused");
  69. }
  70. private int determineLength(String s) {
  71. return s.length();
  72. }
  73. public void stopRequest() {
  74. noStopRequested = false;
  75. internalThread.interrupt();
  76. }
  77. public boolean isAlive() {
  78. return internalThread.isAlive();
  79. }
  80. private void sendException(Exception x) {
  81. if ( exceptionListeners.size() == 0 ) {
  82. // If there aren't any listeners, dump the stack
  83. // trace to the console.
  84. x.printStackTrace();
  85. return;
  86. }
  87. // Used "synchronized" to make sure that other threads
  88. // do not make changes to the Set while iterating.
  89. synchronized ( exceptionListeners ) {
  90. Iterator iter = exceptionListeners.iterator();
  91. while ( iter.hasNext() ) {
  92. ExceptionListener l = 
  93. (ExceptionListener) iter.next();
  94. l.exceptionOccurred(x, this);
  95. }
  96. }
  97. }
  98. public void addExceptionListener(ExceptionListener l) {
  99. // Silently ignore a request to add a "null" listener.
  100. if ( l != null ) {
  101. // If a listener was already in the Set, it will
  102. // silently replace itself so that no duplicates
  103. // accumulate.
  104. exceptionListeners.add(l);
  105. }
  106. }
  107. public void removeExceptionListener(ExceptionListener l) {
  108. // Silently ignore a request to remove a listener
  109. // that is not in the Set.
  110. exceptionListeners.remove(l);
  111. }
  112. public String toString() {
  113. return getClass().getName() + 
  114. "[isAlive()=" + isAlive() + "]";
  115. }
  116. }