1

在我正在进行的一个项目中,我有一个扩展 JFrame 的主类(名为 TrackWin)。在这个框架中,我使用了 JTabbedPane。

用户可以从菜单栏在窗格中创建一个新选项卡。每当发生这种情况时,就会在 TrackWin 中调用 tabbedPane.addTab()。

我还有一个名为 TrackTab 的类,它扩展了 JPanel。此类包含新选项卡的所有实际信息。此类中包含一个 Thread,它调用“第 3 方”类(和类组)以在单击 JButton 时执行特定操作。

但是,每当我创建多个选项卡并尝试一次启动多个线程实例时,就会出现我的问题。当我运行调试器(我正在使用 Eclipse)时,我注意到每当单击 JButton 时创建的当前线程集被另一个选项卡的线程实例覆盖。

但是,我不得不认为我的问题是由于我自己的实现,而不是我正在制作实例的“第 3 方”类的性质。因为,如果我向 TrackTab 类添加多个线程实例(例如,Thread1 和 Thread2,它们都创建/调用第三方类的新实例),调试器会为每个实例显示一组线程,并且它们运行良好.

我会很感激任何建议!

这是一些示例代码:

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);
    }
}

我没有关于 3rd 方类包的大量信息(因为我没有深入研究它),但我知道有一些静态变量可能会导致问题。我认识到可能需要进行一些重构。但是,我想知道是否是我的代码首先给我带来了问题。

奇怪的是,在 TrackTab 中,如果我添加另一个 TrackThread 实例并从 TrackTab 的单个实例同时运行它们,一切顺利)。太奇怪了。请帮忙!

4

2 回答 2

2

这可能与您遇到的问题无关,但您的线路:

thread = new Thread(new TrackThread(variable1, variable2, variable3));

看起来很“有趣”——TrackThread 本身扩展了 Thread,你不需要在它周围包裹另一个线程来运行它。要么让 TrackThread 实现 Runnable(不再扩展 Thread),要么只写:

thread = new TrackThread(variable1, variable2, variable3);

这应该同样有效,并且可以节省不必要的线程对象的创建。

此外,在调试线程时,命名它们非常有用,以便更容易区分。使用 setName() 或带有名称参数的构造函数之一。

于 2009-08-10T15:04:10.220 回答
0

除了西蒙的观察和建议,我建议你尽量减少你的未知数。

在这种情况下,这将意味着嘲笑您的第三方课程。将其替换为您知道不会有任何静态问题的东西。没什么花哨的,只是一个在某处运行并产生输出的简单线程。

于 2009-08-10T15:29:20.047 回答