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

进程与线程

开发平台:

Java

  1. import java.io.*;
  2. import java.net.*;
  3. import java.util.*;
  4. public class CalcServerTwo extends Object {
  5. private ServerSocket ss;
  6. private List workerList;
  7. private Thread internalThread;
  8. private volatile boolean noStopRequested;
  9. public CalcServerTwo(int port) throws IOException {
  10. ss = new ServerSocket(port);
  11. workerList = new LinkedList();
  12. noStopRequested = true;
  13. Runnable r = new Runnable() {
  14. public void run() {
  15. try {
  16. runWork();
  17. } catch ( Exception x ) {
  18. // in case ANY exception slips through
  19. x.printStackTrace(); 
  20. }
  21. }
  22. };
  23. internalThread = new Thread(r);
  24. internalThread.start();
  25. }
  26. private void runWork() {
  27. System.out.println(
  28. "in CalcServer - ready to accept connections");
  29. while ( noStopRequested ) {
  30. try {
  31. System.out.println(
  32. "in CalcServer - about to block " +
  33. "waiting for a new connection");
  34. Socket sock = ss.accept();
  35. System.out.println(
  36. "in CalcServer - received new connection");
  37. workerList.add(new CalcWorkerTwo(sock));
  38. } catch ( IOException iox ) {
  39. if ( noStopRequested ) {
  40. iox.printStackTrace();
  41. }
  42. }
  43. }
  44. // stop all the workers that were created
  45. System.out.println("in CalcServer - putting in a " +
  46. "stop request to all the workers");
  47. Iterator iter = workerList.iterator();
  48. while ( iter.hasNext() ) {
  49. CalcWorkerTwo worker = (CalcWorkerTwo) iter.next();
  50. worker.stopRequest();
  51. }
  52. System.out.println("in CalcServer - leaving runWork()");
  53. }
  54. public void stopRequest() {
  55. System.out.println(
  56. "in CalcServer - entering stopRequest()");
  57. noStopRequested = false;
  58. internalThread.interrupt();
  59. if ( ss != null ) {
  60. try {
  61. ss.close();
  62. } catch ( IOException x ) {
  63. // ignore
  64. } finally {
  65. ss = null;
  66. }
  67. }
  68. }
  69. public boolean isAlive() {
  70. return internalThread.isAlive();
  71. }
  72. public static void main(String[] args) {
  73. int port = 2001;
  74. try {
  75. CalcServerTwo server = new CalcServerTwo(port);
  76. Thread.sleep(15000);
  77. server.stopRequest();
  78. } catch ( IOException x ) {
  79. x.printStackTrace();
  80. } catch ( InterruptedException x ) {
  81. // ignore
  82. }
  83. }
  84. }