Thinh Phan
Thinh Phan

Reputation: 655

Run a new thread and don't wait this thread finish

I am new to the Threading, so if please give me an advice for my case.

I would like create a new thread to do something and I don't care this thread can do complete or not.

I intend to use ExecutorCompletionService to do my job but this class is not suitable for me. It must call take or poll to drain a queue to avoid memory leak. So, this means I must wait until the thread complete. I read this from this question

This is the current code

ExecutorService executor = Executors.newCachedThreadPool();

CompletionService<Entity> completion = new ExecutorCompletionService<>(executor);

DoSomeThingClass doSomething = getInstance();

completion.submit(doSomething);

executor.shutdown();

// Continue to do other job and I don't care whenever doSomeThing is complete.
// However when doSomeThing finish, I don't need to do anything to avoid memory leak

For that reason, please give me an approach for my case and some skeleton code for example.

Thank you so much

Upvotes: 3

Views: 2940

Answers (4)

Thinh Phan
Thinh Phan

Reputation: 655

I can resolve my problem as the following code

public static void main(
    String[] args) {
    ExecutorService executor = Executors.newCachedThreadPool();
    executor.execute(new Runnable() {
        @Override
        public void run() {
            try {
                TimeUnit.SECONDS.sleep(2);
            } catch (InterruptedException e) {

            } finally {
                System.out.println("Thread 2 is finished");
            }
        }
    });
    executor.shutdown();
    System.out.println("Thread 1 is finished");
}

Upvotes: 0

Abhishek Mishra
Abhishek Mishra

Reputation: 639

Along with you code your Future concept

Future ft=completion.submit(doSomething);
ft.get(timeOut, TimeUnit.MILLISECONDS);

here you can specify Time to execute Thread if it fail to get execute thread get kill(not 100% sure)means it try to interrupt the thread and try to kill

Upvotes: 0

FruitDealer
FruitDealer

Reputation: 174

You can mark this thread as "Daemon". And when your main thread completed, your app will exit.

    public static void main(String[] args)
    {
    Thread t = new Thread(new Runnable() {
        @Override
        public void run() {
            try {
                TimeUnit.SECONDS.sleep(2);
            } catch(InterruptedException e) {}
            System.out.println("Thread 2 is finished");

        }
    });
    t.setDaemon(true);
    t.start();
    System.out.println("Thread 1 is finished");
}

Upvotes: 2

Federico Piazza
Federico Piazza

Reputation: 30985

You can use Spring TaskExecutor, it is very useful to raise a thread to run a task.

import org.springframework.core.task.TaskExecutor;

public class TaskExecutorExample {

    private class MessagePrinterTask implements Runnable {
        private String message;

        public MessagePrinterTask(String message) {
            this.message = message;
        }

        public void run() {
            System.out.println(message);
        }

    }

    private TaskExecutor taskExecutor;

    public TaskExecutorExample(TaskExecutor taskExecutor) {
        this.taskExecutor = taskExecutor;
    }

    public void printMessages() {
        for(int i = 0; i < 25; i++) {
            taskExecutor.execute(new MessagePrinterTask("Message" + i));
        }
    }
}

You can check Spring Task Execution documentation here:

http://docs.spring.io/spring/docs/3.0.x/spring-framework-reference/html/scheduling.html

Upvotes: 1

Related Questions