О много поточной обработке

Как уничтожить поток?..... Как перезапустить их снова во много поточной обработке?

5
задан Aditya W 7 June 2016 в 15:39
поделиться

6 ответов

Я обернул свои рабочие потоки в их собственный класс и использую свойство terminated, чтобы убить цикл обработки потока.

извините, у меня сейчас нет под рукой java версии, но вы должны понять идею из этого http://pastie.org/880516

using System.Threading; 

namespace LoaderDemo
{
    class ParserThread
    {
        private bool m_Terminated;
        private AutoResetEvent m_Signal;
        private string m_FilePath;
        ...

        public ParserThread(AutoResetEvent signal, string filePath)
        {
            m_Signal = signal; 
            m_FilePath = filePath;

            Thread thrd = new Thread(this.ThreadProc);
            thrd.Start(); 
        }

        public bool Terminated { 
            set { m_Terminated = value; } 
        }

        private Guid Parse(ref string s)
        {
            //parse the string s and return a populated Guid object
            Guid g = new Guid();

            // do stuff...

            return g;
        }

        private void ThreadProc()
        {
            TextReader tr = null;
            string line = null;
            int lines = 0;

            try
            {
                tr = new StreamReader(m_FilePath);
                while ((line = tr.ReadLine()) != null)
                {
                    if (m_Terminated) break;

                    Guid g = Parse(ref line);
                    m_GuidList.Add(g);
                    lines++;
                }

                m_Signal.Set(); //signal done

            }
            finally
            {
                tr.Close();
            }

        }

    }
}
2
ответ дан 18 December 2019 в 13:12
поделиться

Лучший способ убить поток - установить флаг для наблюдения за потоком. Запрограммируйте поток для выхода, когда он увидит, что флаг установлен в значение true. Невозможно перезапустить убитый поток.

1
ответ дан 18 December 2019 в 13:12
поделиться

Поскольку ваше сообщение помечено как "Java", я хорошо понимаю, о чем вы говорите. Допустим, вы запускаете поток, выполняя:

Thread foo = new Thread(someRunnable);
foo.start();

Теперь, когда destroy и друзья устарели, вам нужен способ убить поток. К счастью для вас, понятие «прерывания» существовало всегда. Просто измените свой runnable так, чтобы при прерывании он выходил. Затем вызовите метод прерывания потока .

foo.interrupt();

Если вы написали Runnable, чтобы справиться с этим правильно, он остановит все, что делает, и завершится.

4
ответ дан 18 December 2019 в 13:12
поделиться

Thread.stop () убивает поток, но вы определенно не этого делать (см. Документацию по API для объяснения причин). Thread.interrupt () отправляет асинхронное уведомление потоку, чтобы он мог корректно закрыться.

Чтобы получить исчерпывающий текст о многопоточности Java, я рекомендую Б. Гетца, Java Concurrency in Practice , Addison-Wesley Professional.

3
ответ дан 18 December 2019 в 13:12
поделиться

Предпочтительный способ смерти потока - это выполнение метода run до завершения :

Thread t = new Thread(new Runnable() {
  public void run() {
    // Do something...

    // Thread will end gracefully here.
  }
}

После корректного завершения потока в приведенном выше примере, поток не может быть перезапущен. (Попытка вызвать Thread.start в потоке, который уже был запущен, вызовет исключение IllegalThreadStateException .)

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

Вероятно, хорошее место для получения дополнительной информации о многопоточности было бы Урок: Параллелизм из Учебники по Java .

3
ответ дан 18 December 2019 в 13:12
поделиться

Если вы хотите запускать, останавливать, перезапускать потоки по своему желанию, возможно, хорошей идеей будет использование пакета параллелизма Java 5. У вас может быть Executor, который будет делать небольшую работу, и когда вам нужно, чтобы эта часть работы была проделана снова, вы можете просто переназначить ее для выполнения в Executor.

1
ответ дан 18 December 2019 в 13:12
поделиться
Другие вопросы по тегам:

Похожие вопросы: