Java NIO: обмен данными между двумя потоками

#java #nio

#java #nio

Вопрос:

Я хочу реализовать обмен данными между двумя потоками, используя Java NIO. Это мой код:

Test.java

 public class Test {
    final static int BUFSIZE = 40;
    private static Handler handler = new Handler();
    public static void main(String[] args) throws  Exception {
        final Pipe pipe = Pipe.open();
        new Thread(() -> {
            ReadableByteChannel dst = pipe.source();
            ByteBuffer buffer = ByteBuffer.allocate(BUFSIZE);
            while (true) {
                try {
                    while (dst.read(buffer) >= 0) {
                        buffer.flip();
                        String s = "";
                        while (buffer.remaining() > 0)
                            s = s   new String(new byte[]{buffer.get()});
                        buffer.clear();
                        System.out.println(s);
                    }
                } catch (IOException ioe) {
                    System.err.println(ioe.getMessage());
                }
            }
        }).start();

        PackListener pl = packet -> {
            WritableByteChannel src = pipe.sink();
            ByteBuffer buffer = ByteBuffer.allocate(BUFSIZE);
            buffer.clear();
            buffer.put(packet.getBytes());
            buffer.flip();
            while (src.write(buffer) > 0) ;
            src.close();
        };
          for (int i = 0; i < 3; i  ) {
            handler.execInterface(pl);
        }
    }
}
  

PackListener.java

 public interface PackListener {
    void doSmth(String packet);
}
  

Handler.java

 public class Handler {
    public void  execInterface(PackListener pl) {
        String packet = "Hello:"   LocalDateTime.now().toString();
        pl.doSmth(packet);
    }
}
  

Я ожидал, что три раза:

 Hello:2020-08-21T23:42:53.056
Hello:2020-08-21T23:42:53.057
Hello:2020-08-21T23:42:53.058
  

но я получил:

 Hello:2020-08-21T23:42:53.056
null
null
  

Я попробовал «while (true)» в теле нового потока, но результат тот же.

Комментарии:

1. Не делайте этого. Вы берете молоток, чтобы расколоть орех. Используйте очередь.