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

进程与线程

开发平台:

Java

  1. import java.io.*;
  2. import java.net.*;
  3. public class CalcWorker extends Object {
  4. private InputStream sockIn;
  5. private OutputStream sockOut;
  6. private DataInputStream dataIn;
  7. private DataOutputStream dataOut;
  8. private Thread internalThread;
  9. private volatile boolean noStopRequested;
  10. public CalcWorker(Socket sock) throws IOException {
  11. sockIn = sock.getInputStream();
  12. sockOut = sock.getOutputStream();
  13. dataIn = new DataInputStream(
  14. new BufferedInputStream(sockIn));
  15. dataOut = new DataOutputStream(
  16. new BufferedOutputStream(sockOut));
  17. noStopRequested = true;
  18. Runnable r = new Runnable() {
  19. public void run() {
  20. try {
  21. runWork();
  22. } catch ( Exception x ) {
  23. // in case ANY exception slips through
  24. x.printStackTrace(); 
  25. }
  26. }
  27. };
  28. internalThread = new Thread(r);
  29. internalThread.start();
  30. }
  31. private void runWork() {
  32. while ( noStopRequested ) {
  33. try {
  34. System.out.println("in CalcWorker - about to " +
  35. "block waiting to read a double");
  36. double val = dataIn.readDouble();
  37. System.out.println(
  38. "in CalcWorker - read a double!");
  39. dataOut.writeDouble(Math.sqrt(val));
  40. dataOut.flush();
  41. } catch ( IOException x ) {
  42. if ( noStopRequested ) {
  43. x.printStackTrace();
  44. stopRequest();
  45. }
  46. }
  47. }
  48. // In real-world code, be sure to close other streams and
  49. // the socket as part of the clean-up. Omitted here for
  50. // brevity.
  51. System.out.println("in CalcWorker - leaving runWork()");
  52. }
  53. public void stopRequest() {
  54. System.out.println(
  55. "in CalcWorker - entering stopRequest()");
  56. noStopRequested = false;
  57. internalThread.interrupt();
  58. if ( sockIn != null ) {
  59. try {
  60. sockIn.close();
  61. } catch ( IOException iox ) {
  62. // ignore
  63. } finally {
  64. sockIn = null;
  65. }
  66. }
  67. System.out.println(
  68. "in CalcWorker - leaving stopRequest()");
  69. }
  70. public boolean isAlive() {
  71. return internalThread.isAlive();
  72. }
  73. }