我想知道您认为实现程序的最佳方式是两个线程交换字符串并相互响应。
我无法使用java.nio.Pipe和java.io.PipedInputStream / java.io.PipedOutput.Stream
以下是我想要做的代码示例:
主要课程,设置一切。
public static void main(String[] args) {
// TODO
// Create two communication channel, and bind them together
MyThread t1 = new MyThread(channel1Reader, channel2Writer, 0);
MyThread t2 = new MyThread(channel2Reader, channel1Writer, 1);
t1.run();
t2.run();
}
线程类:
public class MyThread extends Thread {
private ? inputStream;
private ? outputStream;
private boolean canTalk;
private int id;
public MyThread(? inputStream, ? outputStream, boolean isStarting, int id) {
this.inputStream = inputStream;
this.outputStream = outputStream;
this.canTalk = isStarting;
this.id = id;
}
public void run() {
while(true) {
if(canTalk) {
String s = getRandomWord();
// TODO
// Write s to the output stream
}
// TODO
// Wait until receiving a String on the input stream
String s2 = the word I just received
Log.info("Thread " + id + " received the word '" + s2 + "'");
canTalk = true;
Thread.sleep(1000);
}
}
有什么想法吗?
谢谢!
答案 0 :(得分:1)
但是,在线程之间交换数据的最简单方法是使用ExecutorService。您可以提交Callable< String>任务到服务并从Future< String>
获得结果另一种方法是使用多个BlockingQueue< String>但这并没有节省太多,而且缺乏ExecutorService为您提供的功能。
您的示例遇到的问题是,将 作为单个线程实现起来更简单。我建议你看一下最好由多个线程执行的功能。
答案 1 :(得分:1)
你在这里使用
t1.run();
t2.run();
这将执行当前线程中两个Thread对象的run方法,并且一个接一个地执行。构造的线程实际上并未启动。
这种方式通信无法工作,因为在写线程写入时尚未启动读取线程,反之亦然。用户
t1.start();
t2.start();
这里,或者使用带有Runnable对象的ThreadPool,而不是Thread子类。
答案 2 :(得分:0)
我通常使用Queue
,可能由LinkedList
支持。
阅读:
synchronized (q) {
while (q.isEmpty() && !stopSignal) {
q.wait(3000);
}
return q.poll();
}
写:
synchronized (q) {
q.add(item);
q.notify();
}