在我正在开发的项目中,我有一个扩展JFrame的主类(名为TrackWin)。在这个框架中,我使用了JTabbedPane。
用户可以从菜单栏在窗格中创建新选项卡。只要发生这种情况,就会在TrackWin中调用tabbedPane.addTab()。
我还有一个名为TrackTab的类,它扩展了JPanel。此类包含新选项卡的所有实际信息。包含在这个类中的是一个Thread,它调用“第三方”类(和一组类),以便在单击JButton时执行特定操作。
然而,无论何时我创建多个选项卡,并尝试一次启动多个线程实例,我的问题就出现了。当我运行调试器(我正在使用Eclipse)时,我注意到每当单击JButton时创建的当前线程集都会被另一个选项卡的线程实例覆盖。
但是,我必须认为我的问题是由于我自己的实现,而不是我正在制作实例的“第三方”类的性质。因为,如果我向TrackTab类添加多个Thread实例(例如,Thread1和Thread2,它们都会调用/调用第三方类的新实例),调试器会为每个实例显示一组Threads,并且它们运行正常
我很感激任何建议!
以下是一些示例代码:
public class TrackWin extends JFrame {
public JTabbedPane tabbedPane;
public TrackWin()
{
tabbedPane = new JTabbedPane();
TrackTab panel = new TrackTab();
tabbedPane.addTab("Tab Name", null, panel,
"Tab Instance");
tabbedPane.updateUI();
add(tabbedPane);
/////////////////////////////////////////////////////////////
// Initialize Menu Bar
/////////////////////////////////////////////////////////////
JMenuBar menuBar = new JMenuBar();
JMenu menu;
JMenuItem menuItem;
menu = new JMenu("File");
menu.setMnemonic(KeyEvent.VK_F);
// New Tab Instance
menuItem = new JMenuItem("New Instance");
menuItem.addActionListener(new java.awt.event.ActionListener() {
public void actionPerformed(java.awt.event.ActionEvent evt) {
TrackTab panel = new TrackTab();
tabbedPane.addTab("Tab Name", null, panel, "Tab Instance");
tabbedPane.updateUI();
tabbedPane.repaint();
tabbedPane.setVisible(true);
}
});
menu.add(menuItem);
setJMenuBar(menuBar);
setVisible(true);
}
}
TrackTab.java的线程调用:
thread = new Thread(new TrackThread(variable1, variable2, variable3));
thread.start();
其中,'thread'是TrackTab的公共全局变量。
然后,TrackThread类很简单:
public class TrackThread extends Thread {
public int variable1;
public int variable2;
public int variable3;
public TrackThread(int variable1, int variable2, int variable3) {
this.variable1 = variable1;
this.variable2 = variable2;
this.variable3 = variable3;
}
public void run() {
3rdPartyClass myPub = new 3rdPartyClass();
myPub.do(variable1, variable2, variable3);
}
}
我没有关于第三方类包的大量信息(因为我没有深入研究它),但我知道有一些静态变量可能会导致问题。我认识到可能需要进行一些重构。但是,我想知道是不是我的代码首先给了我这些问题。
奇怪的是,在TrackTab中,如果我添加另一个TrackThread实例并从TrackTab的单个实例中并行运行它们,一切顺利。太奇怪了。请帮忙!
答案 0 :(得分:2)
这可能与您遇到的问题无关,但您的行:
thread = new Thread(new TrackThread(variable1, variable2, variable3));
看起来'有趣' - TrackThread本身扩展了Thread,你不需要在它周围包裹另一个线程来运行它。要么让TrackThread实现Runnable(而不再扩展Thread),要么只写:
thread = new TrackThread(variable1, variable2, variable3);
这应该也可以正常工作并保存不需要的线程对象的创建。
此外,在调试线程时,命名它们非常有用,因此它们更容易区分。使用setName()或其中一个带有name参数的构造函数。
答案 1 :(得分:0)
除了西蒙的观察和推荐,我建议你尽量减少你的未知数。
在这种情况下,这意味着嘲笑你的第三方课程。用你知道的东西替换它,不要有任何有问题的静力学。没什么好看的,只是一个简单的线程运行并在某处产生输出。