【发布时间】:2014-09-25 16:28:35
【问题描述】:
我是 Java 的初学者,也许我想做一些在 Java 中不起作用的东西,但我希望这里有人可以帮助我。
我想做什么: 我有两个线程,一个线程创建几个相同的对象并使用它,最后我想通过管道将这些对象发送到另一个线程,我想将它保存在一个文件中。
我知道,我可以使用 Vector,因此其他线程可以从那里获取对象,但是在下一步中,我想在服务器和客户端中分离这个项目,所以我需要这些管道来发送对象。我已经在互联网上搜索了正确的答案,但我确实找到了我需要的任何东西。这是我认为可行但没有实现的想法:
主线程:
public class ControlerThread {
public static void main(String[] args) {
PipedReader pr = new PipedReader();
PipedWriter pw = new PipedWriter();
PipedOutputStream pos = null;
PipedInputStream pis = null;
ObjectOutputStream oos =null;
ObjectInputStream ois = null;
try
{
pw.connect(pr);
pis = new PipedInputStream();
pos = new PipedOutputStream(pis);
oos = new ObjectOutputStream(pos);
ois = new ObjectInputStream(pis);
}catch(IOException ioe)
{
}
ModelThread mt = new ModelThread(ois,pr);
ViewThread vt = new ViewThread(oos,pw);
vt.start();
mt.start();
}
}
我在其中创建对象的 ViewThread...
public class ViewThread extends Thread{
PipedWriter pw;
BufferedWriter bw;
ObjectOutputStream oos;
public ViewThread(ObjectOutputStream oos,PipedWriter pwr )
{
this.oos = oos;
this.pw = pwr;
bw = new BufferedWriter(pw);
}
public void run()
{
int iEingabe = 0;
Menu mu = new Menu();
do {
iEingabe = 0;
System.out.println("\t eine neue Person aufnehmen: > 1");
System.out.println("\t \t Records auflisten: > 2");
System.out.println(" Records in eine Datei sichern: > 3");
System.out.println(" Records aus einer Datei laden: > 4");
System.out.println(" in-memory Records sortieren: > 5");
System.out.println("\t\t Datei löschen: > 6");
System.out.println("\t das Programm verlassen: > 7");
System.out.print("\nIhre Eingabe: ");
iEingabe = Eingabe.readInt();
switch (iEingabe) {
case 1: mu.addContact(); break;
case 2: mu.outputMatrix(); break;
case 3: try{
bw.write("3");
bw.write("\n");
bw.flush();
Kontakt k = new Kontakt();
oos.writeObject(k);
oos.flush();
}catch(IOException ioe)
{
ioe.printStackTrace();
}; break;
case 4: break;
case 5: mu.kontakteSortieren();break;
case 6: /*mu.deleteFile()*/; break;
case 7: System.out.println("Programm wird beended!"); break;
}
} while (iEingabe != 7);
}
}
这是稍后应该获取对象的线程:
package Thread;
import java.io.*;
public class ModelThread extends Thread{
private PipedReader pr = null;
private BufferedReader br = null;
//private String datei = "test.csv";
//private FileOutputStream fos;
//private ObjectOutputStream oos = null;
// private FileInputStream fis;
private ObjectInputStream ois = null;
public ModelThread(ObjectInputStream ois,PipedReader pr)
{
this.pr = pr;
br = new BufferedReader(pr);
this.ois = ois;
}
public void run()
{
try
{
if(br.readLine().equals("3"))
{
Kontakt k = (Kontakt) ois.readObject();
System.out.println(k.name);
}
}catch(IOException e)
{
}catch(ClassNotFoundException ce)
{
}
}
}
但是如果我像上面那样做,我会得到一个 IOException “Read end dead”。我希望每个人都明白我想做什么并能帮助我。
例外:
java.io.IOException: Read end dead
at java.io.PipedInputStream.checkStateForReceive(Unknown Source)
at java.io.PipedInputStream.receive(Unknown Source)
at java.io.PipedOutputStream.write(Unknown Source)
at java.io.ObjectOutputStream$BlockDataOutputStream.writeBlockHeader(Unknown Source)
at java.io.ObjectOutputStream$BlockDataOutputStream.drain(Unknown Source)
at java.io.ObjectOutputStream$BlockDataOutputStream.flush(Unknown Source)
at java.io.ObjectOutputStream.flush(Unknown Source)
at Thread.ViewThread.run(ViewThread.java:57)
谢谢!!!
【问题讨论】:
-
请发布异常。一般来说,我不明白为什么你必须两次扩展同一个线程类;但是,run 方法在哪里?
-
我编辑了我的帖子,现在有所有类和异常
-
嘿...我喜欢你的 PipedInputStream 变量名...“pis”
标签: java multithreading objectoutputstream