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

进程与线程

开发平台:

Java

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