Пуснете нова нишка и не чакайте тази нишка да приключи

Аз съм нов в 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 a 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
@Fede: Благодаря ти. Не използвам Spring   -  person Thinh Phan    schedule 02.07.2014


Отговори (4)


Можете да маркирате тази тема като "Daemon". И когато основната ви нишка завърши, приложението ви ще излезе.

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

тук можете да посочите време за изпълнение на нишката, ако не успее да изпълни нишката, вземете унищожаване (не е 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