日期:2014-05-20  浏览次数:20681 次

Callable和Runnable是不是也是(简单的)线程?
本帖最后由 jdgdf566 于 2013-11-30 21:39:52 编辑
实现了Callable或Runnable的类的实例是不是也是(简单的)线程?存在线程安全问题?

    public static void main(String args[]) throws Exception {
        for (UIManager.LookAndFeelInfo info : UIManager.getInstalledLookAndFeels()) {
            if ("Windows".equals(info.getName())) {
                UIManager.setLookAndFeel(info.getClassName());
                break;
            }
        }
        SwingUtilities.invokeLater(new Runnable() {
            @Override
            public void run() {
                MyJFrame myJFrame = new MyJFrame();
                myJFrame.setLocation(300, 300);
                myJFrame.setVisible(true);
            }
        });
        //现在我要改变myJFrame的位置,也就是运行myJFrame.setLocation(),怎么写?
    }

现在我要改变myJFrame的位置,也就是运行myJFrame.setLocation(),在第16行处怎么写?

------解决方案--------------------
你在匿名类里面申明的引用,在外面肯定拿不到啊。不能这样做。既然你需要在其他地方访问myJFrame,那你就要把这个引用放到外面来申明。
------解决方案--------------------
引用:
Quote: 引用:

你在匿名类里面申明的引用,在外面肯定拿不到啊。不能这样做。既然你需要在其他地方访问myJFrame,那你就要把这个引用放到外面来申明。


Runnable runnable = new Runnable() {
            @Override
            public void run() {
                MyJFrame myJFrame = new MyJFrame();
                myJFrame.setLocation(300, 300);
                myJFrame.setVisible(true);
            }
        }
SwingUtilities.invokeLater(runnable);

实现了Callable或Runnable的类的实例是不是也是(简单的)线程?存在线程安全问题?


不是所有的实现了Runnable的类都是线程,Java线程只有一个就是Thread,Runnable也须要依靠Thread才能启动。
在你这里确实是在线程中运行的,那是因为你调用了SwingUtilities.invokeLater,但是你这里应该基本不存在线程安全问题。因为你在外面访问不到myJFrame,没有数据共享就不存在线程安全问题。