我正在尝试创建两个线程,其中一个使用keylistener和pipedoutputstream来为另一个线程(pipedinputstream)提供输入。我实现它的方式:Main中的两个Runnable类,main(String [] args)使用ExecutorService来控制这两个线程。由于对如何使用其中一些类很少了解,我几乎没有提出如下内容(跳过一些代码):
public class Main {
final static PipedOutputStream pipedOut = new PipedOutputStream();
final static PipedInputStream pipedIn = new PipedInputStream();
class ListenerOutput extends JPanel implements KeyListener, Runnable {
int eventKey;
char c;
ListenerOutput() {
this.setPreferredSize(new Dimension(500, 500));
addKeyListener(this);
JFrame f = new JFrame();
f.getContentPane().add(new ListenerOutput());
f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
f.pack();
f.setVisible(true);
}
@Override
{...}
}
class GameLoop implements Runnable {...}
main(String[] args){
try {
pipedOut.connect(pipedIn);
} catch (IOException e) {
e.printStackTrace();
}
ExecutorService service = Executors.newFixedThreadPool(2);
service.execute(new Main().new ListenerOutput());
service.execute(new Main().new GameLoop());
}
问题在于f.getContentPane().add(new ListenerOutput());
行。它是递归的,没有尽头。我知道它会抛出StackOverflow错误。但是,我仍然很困惑该做什么。提前谢谢!
答案 0 :(得分:2)
从构造函数中,该行提供了一个提示:
addKeyListener(this);
避免递归:
// f.getContentPane().add(new ListenerOutput());
f.getContentPane().add(this);
因此JFrame f
使用与KeyListener类似的构造对象。