Запустите новый поток и не ждите окончания этого потока

Я новичок в Threading, поэтому, пожалуйста, дайте мне совет для моего случая.

Я хотел бы создать новый поток, чтобы что-то сделать, и мне все равно, может ли этот поток завершиться или нет.

Я намерен использовать ExecutorCompletionService для выполнения своей работы, но этот класс мне не подходит. Он должен вызывать take или poll для очистки очереди во избежание утечки памяти. Итак, это означает, что я должен дождаться завершения потока. Я прочитал это из этого вопроса

Это текущий код

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

По этой причине, пожалуйста, дайте мне подход для моего случая и, например, какой-нибудь скелетный код.

Большое спасибо


person Thinh Phan    schedule 02.07.2014    source источник
comment
Не могли бы вы просто, знаете, start и Thread?   -  person user2357112 supports Monica    schedule 02.07.2014
comment
Если вам все равно, выполнит ли поток свою задачу или нет, то вам действительно нужна такая задача?   -  person PM 77-1    schedule 02.07.2014
comment
Вы используете весну?   -  person Federico Piazza    schedule 02.07.2014
comment
@Феде: Спасибо. Я не использую Весну   -  person Thinh Phan    schedule 02.07.2014


Ответы (4)


Вы можете пометить эту тему как "Демон". И когда ваш основной поток завершится, ваше приложение завершится.

    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");
}
person FruitDealer    schedule 02.07.2014

Вы можете использовать Spring TaskExecutor, очень полезно поднять поток для запуска задачи.

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

Вы можете проверить документацию Spring Task Execution здесь:

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

person Federico Piazza    schedule 02.07.2014
comment
Введение зависимости Spring кажется излишним просто для запуска потока. - person Wyzard; 02.07.2014
comment
@Wyzard, лол, ты прав, не знаю, почему я думал, что он использует Spring. Я сохраню ответ, возможно, OP использует Spring, если нет, я его удалю. - person Federico Piazza; 02.07.2014

Вместе с вами кодируйте свою концепцию будущего

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

здесь вы можете указать время для выполнения потока, если он не может получить выполнение потока. get kill (не уверен на 100%) означает, что он пытается прервать поток и попытаться убить

person Abhishek Mishra    schedule 02.07.2014

Я могу решить свою проблему как следующий код

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");
}
person Thinh Phan    schedule 03.07.2014