Как уничтожить поток?..... Как перезапустить их снова во много поточной обработке?
Я обернул свои рабочие потоки в их собственный класс и использую свойство 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();
}
}
}
}
Лучший способ убить поток - установить флаг для наблюдения за потоком. Запрограммируйте поток для выхода, когда он увидит, что флаг установлен в значение true. Невозможно перезапустить убитый поток.
Поскольку ваше сообщение помечено как "Java", я хорошо понимаю, о чем вы говорите. Допустим, вы запускаете поток, выполняя:
Thread foo = new Thread(someRunnable);
foo.start();
Теперь, когда destroy
и друзья устарели, вам нужен способ убить поток. К счастью для вас, понятие «прерывания» существовало всегда. Просто измените свой runnable так, чтобы при прерывании он выходил. Затем вызовите метод прерывания потока
.
foo.interrupt();
Если вы написали Runnable, чтобы справиться с этим правильно, он остановит все, что делает, и завершится.
Thread.stop ()
убивает поток, но вы определенно не этого делать (см. Документацию по API для объяснения причин). Thread.interrupt ()
отправляет асинхронное уведомление потоку, чтобы он мог корректно закрыться.
Чтобы получить исчерпывающий текст о многопоточности Java, я рекомендую Б. Гетца, Java Concurrency in Practice , Addison-Wesley Professional.
Предпочтительный способ смерти потока
- это выполнение метода run
до завершения :
Thread t = new Thread(new Runnable() {
public void run() {
// Do something...
// Thread will end gracefully here.
}
}
После корректного завершения потока в приведенном выше примере, поток
не может быть перезапущен. (Попытка вызвать Thread.start
в потоке, который уже был запущен, вызовет исключение IllegalThreadStateException
.)
В этом случае можно создать другой экземпляр потока и вызвать начало
на этом.
Вероятно, хорошее место для получения дополнительной информации о многопоточности было бы Урок: Параллелизм из Учебники по Java .
Если вы хотите запускать, останавливать, перезапускать потоки по своему желанию, возможно, хорошей идеей будет использование пакета параллелизма Java 5. У вас может быть Executor, который будет делать небольшую работу, и когда вам нужно, чтобы эта часть работы была проделана снова, вы можете просто переназначить ее для выполнения в Executor.