What does this java .execute() method call mean?
Asked Answered
O

2

6

I was doing some reading through the sun java tutorials, and I came across this page here:

How to Make an Applet

Under the heading, "Threads in Applets" I found this piece of code:

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

First up I'm newish, so I'm sorry if this is a stupid question. However I've never heard of that ".excecute()". I don't understand it, and I'm unable to find anything about it from google. I see this here is... an anonymous inner class? (Please correct me) and it is starting a thread to load in images. I thought that the run() method is invoked with a call to start()? Please help me clear this confusion.

Overdevelop answered 25/5, 2012 at 11:34 Comment(2)
E
8

execute is a method of SwingWorker. What you're seeing there is an anonymous class being instantiated and having its execute method called immediately.

I have to admit I'm a bit surprised that code compiles, though, because it seems to be assigning the result of execute to the worker variable, and the documentation tells us that execute is a void function.

If we deconstruct that code a bit, it can be clearer. First, we create an anonymous class extending SwingWorker and create an instance of it, all at the same time (this is the big bit in parentheses):

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
    }

};

Then we call execute and assign the result to worker (which is the bit that, it seems to me, shouldn't compile):

SwingWorker worker = tmp.execute();

Update: And indeed, I tried it and it doesn't compile. So not great example code. This would compile:

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();
Electromotor answered 25/5, 2012 at 11:36 Comment(2)
Oh I see so it's not an instance of Thread? Well I feel silly now.Overdevelop
@yoonsi: No need to feel silly, anonymous classes are tricky. SwingWorker is related to threads, in that it queues up work to happen on a single background thread that is managed by Swing.Electromotor
C
2

The .execute() is calling the execute method on an instance of an anonymous class; i.e. the object created by new SwingWorker<ImageIcon[], Object>(){...}. (It is a class that extends the SwingWorker class.)

According to the javadoc, the execute method schedules the task represented by the instance to be executed on an existing worker thread. The lifecycle of the worker thread (e.g. creation, starting, etcetera) is taken care of by Swing infrastructure.

Cockboat answered 25/5, 2012 at 11:36 Comment(0)

© 2022 - 2024 — McMap. All rights reserved.