6

我正在阅读 sun java 教程,我在这里遇到了这个页面:

如何制作小程序

在“小程序中的线程”标题下,我找到了这段代码:

   //Background task for loading images.
    SwingWorker worker = (new SwingWorker<ImageIcon[], Object>() {
            public ImageIcon[] doInBackground() {
                final ImageIcon[] innerImgs = new ImageIcon[nimgs];
            ...//Load all the images...
            return imgs;
        }
        public void done() {
            //Remove the "Loading images" label.
            animator.removeAll();
            loopslot = -1;
            try {
                imgs = get();
            } ...//Handle possible exceptions
        }

    }).execute();
}

首先我是新手,所以如果这是一个愚蠢的问题,我很抱歉。但是我从未听说过“.excecute()”。我不明白它,我无法从谷歌找到任何关于它的信息。我看到这里是……一个匿名的内部类?(请纠正我)它正在启动一个线程来加载图像。我认为 run() 方法是通过调用 start() 来调用的?请帮助我消除这种困惑。

4

2 回答 2

8

execute是一种方法SwingWorker。您所看到的是一个匿名类被实例化并execute立即调用它的方法。

我不得不承认我对代码编译感到有点惊讶,因为它似乎将结果分配给execute变量worker,并且文档告诉我们这execute是一个void函数。

如果我们稍微解构该代码,它会更清晰。首先,我们同时创建一个匿名类扩展SwingWorker并创建它的一个实例(这是括号中的重要部分):

SwingWorker tmp = new SwingWorker<ImageIcon[], Object>() {
    public ImageIcon[] doInBackground() {
            final ImageIcon[] innerImgs = new ImageIcon[nimgs];
        ...//Load all the images...
        return imgs;
    }
    public void done() {
        //Remove the "Loading images" label.
        animator.removeAll();
        loopslot = -1;
        try {
            imgs = get();
        } ...//Handle possible exceptions
    }

};

然后我们调用execute并将结果分配给worker(在我看来,这是不应该编译的位):

SwingWorker worker = tmp.execute();

更新:确实,我试过了,它没有编译。所以不是很好的示例代码。这将编译:

SwingWorker worker = new SwingWorker<ImageIcon[], Object>() {
    public ImageIcon[] doInBackground() {
            final ImageIcon[] innerImgs = new ImageIcon[nimgs];
        ...//Load all the images...
        return imgs;
    }
    public void done() {
        //Remove the "Loading images" label.
        animator.removeAll();
        loopslot = -1;
        try {
            imgs = get();
        } ...//Handle possible exceptions
    }

};
worker.execute();
于 2012-05-25T11:36:13.247 回答
1

.execute()在匿名类的实例上调用执行方法;即由 . 创建的对象new SwingWorker<ImageIcon[], Object>(){...}。(这是一个扩展类的SwingWorker类。)

根据 javadoc,该execute方法安排由实例表示的任务在现有工作线程上执行。工作线程的生命周期(例如创建、启动等)由 Swing 基础设施负责。

于 2012-05-25T11:36:50.253 回答