Мне нужно обмениваться данными между двумя классами, используя каналы и / или вилки . У меня есть три класса, где класс верхнего уровня начинает выполнение процесса (Front
класс). Класс Front
принимает строку ввода от пользователя и пытается передать ее в класс Back
, Front
также начинает новый процесс, выполняя Back
.
Я пытался передать строковое значение из одного класса в другой, используя PipedInputStream и PipedOutputStream . По какой-то причине я не получаю никаких данных в классе Back
, и процесс также не завершается. Не следует ли привести программу обратно в класс Front
после завершения выполнения в классе Back
? Кажется, он еще не завершен, но выполнение достигает класса Back
. Я добавил print
операторов, и кажется, что класс Back
работает неправильно после inputStream.read()
.
Коды для Front
и Back
классов, которые я включил ниже:
Фронт -
private static int exec(Class Back, List<String> jvmArgs, List <String> args) throws IOException, InterruptedException {
String javaHome = System.getProperty("java.home");
String javaBin = javaHome + File.separator + "bin" + File.separator + "java";
String classpath = System.getProperty("java.class.path");
String className = Back.getName();
List<String> command = new ArrayList<>();
command.add(javaBin);
command.addAll(jvmArgs);
command.add("-cp");
command.add(classpath);
command.add(className);
command.addAll(args);
ProcessBuilder builder = new ProcessBuilder(command);
Process process = builder.inheritIO().start();
process.waitFor();
return process.exitValue();
}
public static PipedOutputStream out= new PipedOutputStream();
public static PipedInputStream input = new PipedInputStream();
public static void main(String[] args) throws IOException, InterruptedException {
Front front = new Front();
Scanner sc = new Scanner(System.in);
System.out.println("Enter Name: ");
front.setName(sc.nextLine());
out.connect(input);
Thread thread1 = new Thread(new Runnable() {
@Override
public void run() {
try {
out.write(name.getBytes());
} catch (IOException e) {
e.getMessage();
}
}
});
System.out.println("Beginning thread execution");
Front.exec(Back.class, new ArrayList<String>(), new ArrayList<String>());
System.out.println("Ending thread execution");
thread1.start();
sc.close();
}
Назад -
public static void main(String[] args) throws IOException {
System.out.println("We are in \"Back\" now");
Front.input.connect(Front.out);
Thread thread2 = new Thread(new Runnable() {
@Override
public void run() {
try {
int data = 0;
data = Front.input.read();
System.out.println("Why MAAN, Why?");
while (data != (-1)) {
System.out.println((char)data);
data = Front.input.read();
}
} catch (IOException e) {
e.printStackTrace();
}
}
});
thread2.start();
Front.input.close();
}
Я ожидаю, что классы будут обмениваться данными, используя потоковые потоки, то есть от Front
до Back
и снова от Back
до Front
, но я не могу получитьлюбое значение в моем Back
классе. Я не уверен в коде, который я написал, но не знаю, как написать его лучше. Где я неправ? Как я могу добиться работы, которая мне нужна. Спасибо, что нашли время, чтобы прочитать до конца. Ты жжешь! ^ _ ^
РЕДАКТИРОВАТЬ: Я пытался реализовать его по-новому с потоками, но теперь я получаю IOException
высказывание Pipe closed
. Я попытался удалить оператор Front.input.close()
, но затем выполнение программы переходит в своего рода бесконечно работающее состояние без предоставления какого-либо вывода или возврата управления программой в родительский поток Front
.