Thread.join() does not work when executing the Thread by ExecutorService

Hadi :

This is my code:

public static void main(String[] args) {
        System.out.println("program started");
        ExecutorService executor = Executors.newCachedThreadPool();
        Thread thread = new Thread(new Runnable() {
            @Override
            public void run() {
                try {
                    Thread.sleep(3000);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
                System.out.println("thread finished");
            }
        });
        executor.execute(thread);
        try {
            thread.join();
        } catch (Exception e) {
            e.printStackTrace();
        }
        System.out.println("thread joined");

    }

When I start my Thread as showed above, thread.join() does not work and it does not wait for the Thread to be finished. I need to execute my Thread by a ExecutorService and also wait for that Thread to be finished. but my code does not work good. Can anyone help me?

Why I am not using Future instead of Thread?

because sometimes I need to interrupt my Thread and wait for that Thread to be finished. but when i cancel a Future, future.get() gets an Exception and does not wait for it's Thread to be finished.

I apologize in advance if the grammar of my sentence is not correct. because I can't speak English well.

GhostCat salutes Monica C. :

Simple answer: don't do that.

Do not mix layers of abstractions like this. The Executor interface doesn't execute() threads. It takes Runnables. It doesn't matter that you pass a Thread object to it, your thread will not be used at all, besides a call to the run() method.

Mixing "low layer" bare iron threads with an abstracted Executor service is simply a bad idea.

The whole point of that thread pool concept is that you do not try to control the underlying threads. There is simply no point in waiting for a pooled thread to end. A thread pool keeps threads around, because establishing threads is a (relatively) costly operations. So they don't end, but live on, to do other work in the future.

The real answer here: either don't use that executor service, or look for a solution that works with that concept (without you going in and doing low level stuff on the side).

And the "real real" answer: step back, and tell us about the "real" problem you intent to solve this way.

Guess you like

Origin http://43.154.161.224:23101/article/api/json?id=110618&siteId=1