【问题标题】:Thread stopping in synchronized block线程在同步块中停止
【发布时间】:2010-01-09 08:24:14
【问题描述】:

我遇到了一个问题,即同步块中的停止线程。我正在使用 TCP 套接字。问题是我正在等待 DataInputStream 对象,我想再次创建一个新套接字,但由于同步块,它不允许我这样做。

我试过Thread.interrupted()。我无法避免同步块。有没有其他方法可以做到这一点?

dis = new DataInputStream(ReadWriteData.kkSocket.getInputStream());
int i = -1;
String aval = ""; //new String();
char c = (char)dis.read();

它在 dis.read() 上被阻止。

当我想创建一个新的套接字时,我应该怎么做才能转义dis.read

提前致谢。

【问题讨论】:

    标签: java android


    【解决方案1】:

    您可以随时检查是否有数据可供读取,方法是调用dis.available() 以确定可以在不阻塞的情况下读取的字节数。

    使用一些额外的逻辑可以创建新的套接字。

    【讨论】:

      【解决方案2】:

      您可以关闭流并以这种方式捕获它,但这可能并不总是最好的选择。

      【讨论】:

      • 我相信这是推荐的方法。
      【解决方案3】:

      如果您知道要拥有多少个流,您可以执行以下操作:

      private static final int N_STREAMS = 3;
      ...
      InputStream[] streams = new InputStream[N_STREAMS];
      List<StringBuilder> outputBuilders = new ArrayList<StringBuilder>();
      for (int i=0; i < N_STREAMS; i++) {
        // A StringBuilder for every stream
        outputBuilder.append(new StringBuilder());
        try {        
          streams[i] = new DataInputStream(ReadWriteData.kkSocket.getInputStream());
        } catch (IOException e) {
          // Propagate error or ignore?
        }
      }
      
      // Read data
      for (int i=0; i < N_STREAMS; i++) {
        InputStream currentStream = streams[i];
        StringBuilder currentBuilder = outputBuilders.get(i);
        if (currentStream != null && currentStream.available() > 0) {
          try {
            currentBuilder.append(stream.read());
          } catch (IOException e) {
            // Do something
          }
        }
        if (currentStream != null && currentStream??? == EOF) {
          // I don't know how to detect EOF on this stream...
          try {
            streams[i] = null; // Mark it as closed
            currentStream.close();
          } catch (...) {
            // Do something
          }
        }
      }
      // You know have a StringBuilder per socket; do with it what you want
      

      您可能已经注意到,我对 Android 一无所知。但这似乎足够通用以适合您的使用,或者至少提供一个提示。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-04-30
        • 1970-01-01
        • 1970-01-01
        • 2012-08-06
        • 1970-01-01
        相关资源
        最近更新 更多