这个Java的.execute()方法调用是什么意思?

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() 来调用的,请帮我澄清这个困惑。


1
这里有个教程:http://docs.oracle.com/javase/tutorial/uiswing/concurrency/worker.html - Konstantin V. Salikhov
http://docs.oracle.com/javase/6/docs/api/javax/swing/SwingWorker.html; http://docs.oracle.com/javase/tutorial/uiswing/concurrency/ - JB Nizet
2个回答

8
executeSwingWorker的一个方法。你看到的是一个匿名类被实例化并立即调用其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();

哦,我明白了,所以它不是Thread的实例?那我现在感觉很傻。 - yoonsi
@yoonsi:不必感到愚蠢,匿名类很棘手。SwingWorker与线程有关,因为它将工作排队在由Swing管理的单个后台线程上。 - T.J. Crowder

2
.execute()是在匿名类的实例上调用execute方法;即通过new SwingWorker<ImageIcon[], Object>(){...}创建的对象。(它是扩展SwingWorker类的类。)
根据javadoc,execute方法安排由该实例表示的任务在现有工作线程上执行。工作线程的生命周期(如创建、启动等)由Swing基础设施来处理。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接