2015-10-20 3 views
1

У меня возникла ситуация, когда мне нужно выполнить некоторую очистку потока во время работы приложения. (Это, в свою очередь, во многом связано с выбором дизайна библиотеки, который, к сожалению, находится вне моего контроля.)Как прервать() поток, заданный его объектом ThreadInfo?

У меня нет доступа к какому-либо соответствующему экземпляру java.lang.Thread, потому что поток создается за пределами моего кода. Это означает, что простые подходы, предлагаемые, например, Java Thread Primitive Deprecation, How to Stop a Thread и How can I interrupt a thread created from within a method?, действительно не помогают мне, потому что все они полагаются на экземпляр Thread, который доступен или доступен для доступа.

я сделать однако есть (совершенно новый) код, который вызывает ThreadMXBean.dumpAllThreads(), который возвращает ThreadInfo []. Это выглядело как хорошая отправная точка для очистки, так как возвращаемый массив дает мне всю информацию, необходимую мне для определения того, какие конкретные потоки, если они есть, нужно очистить.

Из чего я понимаю, что я хочу сделать, это позвонить Thread.interrupt(). См. Например, How exactly do I interrupt a thread?. Проблема в том, что я не могу найти способ сделать это, учитывая только объект ThreadInfo.

С учетом указанных выше сказал, я готов сформулировать вопрос:

Как получить от объекта ThreadInfo к соответствующему объекту резьбы, так что я могу вызывать методы экземпляра объекта Thread?

Альтернативно,, что какой-то другой способ эффективного вызова Thread.interrupt() на нити заданной только объект, описывающий ThreadInfo нить?

предлагались пути решения в идеале должны работать как с Java 7 и Java 8. Они должны работать с Java 8.

Любые рекомендации?

ответ

2

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

Прочтите это question о том, как это сделать.

Я хотел бы сделать что-то вроде этого:

ThreadInfo[] threadInfos = ....; 
Set<Long> tIds = new HashSet<>(); 
for (ThreadInfo tIndo : threadInfos) { 
    tIds.add(tIndo.getId()); 
} 
for (Thread t : Thread.getAllStackTraces().keySet()) { 
    if(tIds.contains(t.getId()) { 
    t.interrupt(); 
    } 
} 
+0

это должно быть комментарием вместо ответа –

+0

Добавлен код. По-моему, это был ответ даже без примера. – kanly

+1

Сравните [Ваш ответ находится в другом замке: когда ответ не является ответом?] (Http://meta.stackexchange.com/q/225370/157730) –

Смежные вопросы