Вопрос

Сценарий

У меня есть этот класс, скажем Foo, чья единственная работа - последовательно выполнить набор задач. Звучит просто, верно? Что ж, все из этих задач выполнены самостоятельно Отдельный поток. Анкет Вместо того, чтобы просто звонить Thread.join() При каждой задаче для обеспечения последовательного выполнения, он использует ReentrantLock а также Condition. Анкет Например,

public class Foo
{
    private final Lock lock;
    private final Condition condition;
    private Future<?> task;

    public Foo()
    {
        lock = new ReentrantLock();
        condition = lock.newCondition();

        run();
    }

    /**
     * Runs Foo
     */
    public void run()
    {
        Runnable runnable = new Runnable()
        {
            @Override
            public void run()
            {
                lock.lock();
                try
                {
                    // do tasks
                }
                finally
                {
                    lock.unlock();
                }

            }
        };

        // Submit task
        task = Executors.newSingleThreadExecutor().submit(runnable);
    }

    /**
     * Blocks execution until signal is received
     */
    public void waitForNotification()
    {
        try
        {
            condition.await();
        }
        catch (InterruptedException e)
        {
        }
    }

    /**
     * Gets the lock
     * 
     * @return Lock
     */
    public final Lock getLock()
    {
        return lock;
    }

    /**
     * Gets the condition
     * 
     * @return Condition
     */
    public final Condition getCondition()
    {
        return condition;
    }

    /**
     * Gets the sender's task
     * 
     * @return Task
     */
    public Future<?> getTask()
    {
        return task;
    }
}

После каждой задачи, waitForNotification() вызывается и ждет другого класса, скажем Bar, к Разбуди. Анкет Единственная работа для Bar это обрабатывать ответ, который сообщает приложению, есть ли задача прошло или же не удалось. Анкет При этом он сделает одну из двух вещей:

  1. Отмена нить вообще (т.е. getTask().cancel)
  2. Будить Тема (т.е. getCondition().signal)

Пункт 2 работает просто отлично, Но пункт 1 не. Анкет Например,

public class Bar
{
    private Foo foo;

    // doesn't work!
    public void handleFailed()
    {
        // Cancel task
        foo.getTask().cancel(true)
    }

    public void handlePassed()
    {
         // Signal waiting Foo
         foo.getLock().lock();
         try
         {
            foo.getCondition().signal();
         }
         finally
         {
            foo.getLock().unlock();
         }
    }
}

Вместо Отмена потока, это просто кажется прерывать это, что вызывает Foo чтобы продолжить свое исполнение. Извините за многословие, но я хотел дать вам, ребята, четкая фотография. Какие-либо предложения?

Это было полезно?

Решение

Afaik, темы не поддерживают понятие «отмены» из коробки. Вы должны выпекать в логике, чтобы «отменить» ваши конкретные задачи, когда ваш поток прерывается. Обычно это делается путем проверки состояния прерывания потока при выполнении вашей задачи/задания и чисто выходить, если статус был установлен на True (что происходит, когда вы называете прерывание).

Образец фрагмента который мощь помогите вам. Также прочитайте, Выключение потоков чисто.

Другие советы

Если задача не остановится при прерывании, флаг будет просто установлен и останется до тех пор, пока задача не закончится или не решит остановиться.

Возможный дубликат http://www.google.co.uk/search?q=how+do+i+Stop+A+thread+in+java 28 000 000 результатов.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top