Как я могу остановить поток, содержащий операцию блокировки? - PullRequest
1 голос
/ 12 апреля 2019

Я работаю над анализатором пакетов, но у меня возникают проблемы с тем, как остановить поток (без устаревших методов), содержащий метод блокировки.

Этот метод относится к loop() из библиотеки pcap4j.Поскольку это метод блокировки, я помещаю его в поток, чтобы основной работал.Однако, чтобы применить фильтр к интерфейсу pcap, мне нужно разорвать цикл и перезапустить его, поскольку функция breakloop() библиотеки возвращает InterruptedException.Поэтому моя идея заключалась в том, чтобы убить поток, содержащий метод.Но так как я не могу попасть в цикл библиотеки, вызывающий блокировку метода, я не могу сделать это, проверяя, прерывается ли поток или нет.

Thread t = new Thread(new Runnable() {
    @Override
    public void run() {
        loop(args);
    }
});
t.start();

Как я могу остановить его?

EDIT : Я перекомпилировал библиотеку из ее источника, удалив исключение InterruptedException из класса PcapHandle.

1 Ответ

2 голосов
/ 12 апреля 2019

Используя Thread # getAllStackTraces , вы можете получить все потоки. SO. Есть несколько других ответов на этот , а также для того, чтобы овладеть потоками. После нахождения темы вы можете прервать ее. Thread.class также имеет некоторые другие идентификаторы, которые также могут помочь найти нить.

Редактировать: Вы используете kaitoy / pcap4j? если это так breakLoop () Ничего не поделаешь с InterruptedException, вот как библиотека предназначена для его взлома. Я хотел бы взглянуть на проблему с их GitHub, если им нужно реализовать функцию.

import java.util.Set;

class TestStuff {

    public static void main(String[] args) {
        Set<Thread> threadSet = Thread.getAllStackTraces().keySet();
        for (Thread thread : threadSet) {
            if(thread.getName().equals("some-name")){
                thread.interrupt();
            }
        }
    }
}

...