作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我有一个 Lanterna 终端应用程序。
使用线程,我想用不同的面板填充一个窗口并相应地读取按键输入。
使用:
thread1 = new ModuleThreads(screen,"Locations","addRightPanel");
thread2 = new ModuleThreads(screen,"Commands","addCenterPanel");
thread1.start();
thread2.start();
第一个线程在右侧面板中显示“位置”菜单。菜单包含:“按 a 退出。”线程有效。出现菜单,然后按 a 退出程序。
现在第二个线程既不出现也不监听按下的匹配键:“按 b 退出。”我还使用反射来轻松更改菜单内容。(无论如何,它是一个个人项目......:))问题是 ui 中仅显示第一个 thread1。反射就起作用了。thread2 本身工作得很好。但就像单线程一样。
public class ModuleThreads extends Thread{
Screen screen;
String myclass,panel;
Class noparams[]={};
Class moduleClass,panelClass;
Class[] paramScreen;
Class[] myPanelClass;
Constructor constructor,moduleConstructor;
Object moduleObject,panelObject;
Method panelGetView,panelMethod,moduleMethod;
Panel mypanel;
private Thread thread1;
public ModuleThreads(Screen screen,String myclass,String panel){
this.screen=screen;
this.myclass=myclass;
this.panel=panel;
//class aanmaken van Screen.class
paramScreen = new Class[1];
paramScreen[0] = Screen.class;
myPanelClass = new Class[1];
myPanelClass[0] = Panel.class;
thread1 = new Thread(this);
thread1.start();
try{
moduleClass = Class.forName("app.modules."+this.myclass);
//package name er voor plakken.
moduleObject = moduleClass.newInstance();
moduleMethod =
moduleClass.getDeclaredMethod("readInput",paramScreen);
moduleConstructor = moduleClass.getConstructor();
panelClass = Class.forName("app.view.MainView");
constructor = panelClass.getConstructor(Screen.class);
panelObject= constructor.newInstance(this.screen);
panelGetView = moduleClass.getDeclaredMethod("getView",noparams);
panelMethod =
panelClass.getDeclaredMethod(this.panel,myPanelClass);
mypanel = (Panel) panelGetView.invoke(moduleObject,null);
panelMethod.invoke(panelObject, mypanel);
moduleMethod.invoke(moduleObject,this.screen);
}catch(Exception e){
e.printStackTrace();
}
}
public void start(){
}
@Override
public void run(){
try{
mypanel = (Panel) panelGetView.invoke(moduleObject,null);
panelMethod.invoke(panelObject, mypanel);
moduleMethod.invoke(moduleObject,this.screen);
}catch(Exception ex){
ex.printStackTrace();
}
}
}
我做错了什么?为什么只有线程 1 或线程 2 出现,而不是两者都出现,并且具有两个关键监听器?
最佳答案
1) 为什么要像这样重写 Thread
的 start()
方法:
public void start(){
}
通过这样做,您可以防止调用 run()
方法。来自javadoc:
void java.lang.Thread.start()
Causes this thread to begin execution; the Java Virtual Machine calls the run method of this thread
2)每个线程启动两次。
thread1 = new ModuleThreads(screen,"Locations","addRightPanel");
thread2 = new ModuleThreads(screen,"Commands","addCenterPanel");
thread1.start();
thread2.start();
和
public ModuleThreads(Screen screen,String myclass,String panel){
...
thread1 = new Thread(this);
thread1.start();
...
您应该启动您的线程。您可以删除在 ModuleThreads
构造函数中执行的 start()
调用,因为它更适合在线程外部决定何时启动线程。
关于java - 线程不适用于 Laterna,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41651517/
我是一名优秀的程序员,十分优秀!