как убить поток, который ожидает вызова функции блокировки в Java?

У меня есть поток:

Thread t = new Thread(){
    public void run(){
        ServerSocketConnection scn = (ServerSocketConnection)
                Connector.open("socket://:1234");
        // Wait for a connection.
        SocketConnection sc = (SocketConnection) scn.acceptAndOpen();
       //do other operation
    }
};
t.start();

Допустим, ни один клиент не подключается к серверу, поэтому этот поток будет заблокирован. Теперь я хочу убить указанный выше поток t? Как я могу его убить?

9
задан gnat 23 November 2012 в 10:38
поделиться

6 ответов

Thread.interrupt () не будет , а не прерывать поток, заблокированный на сокете. Вы можете попробовать вызвать Thread.stop () или Thread.destroy () , но эти методы устарели (править: на самом деле отсутствует в J2ME) и в некоторых случаях не работает, по причинам, вы можете прочитать о здесь .Как упоминается в этой статье, лучшим решением в вашем случае является закрытие сокета, который вы блокируете:

В некоторых случаях вы можете использовать специальные уловки для приложения. Например, если поток ожидает на известном сокете, вы можете закрыть сокет, чтобы поток немедленно вернулся. К сожалению, на самом деле не существует какой-либо техники, которая бы вообще работала. Следует отметить, что во всех ситуациях, когда ожидающий поток не отвечает на Thread.interrupt, он также не отвечает на Thread.stop. К таким случаям относятся преднамеренные атаки типа «отказ в обслуживании» и операции ввода-вывода, для которых thread.stop и thread.interrupt не работают должным образом.

8
ответ дан 4 December 2019 в 22:26
поделиться

Вы можете вызвать thread.interrupt () . Это вызовет исключение InterruptedException в вашем потоке

0
ответ дан 4 December 2019 в 22:26
поделиться

Сделайте основной поток МОНИТОР НИТИ (откуда вы создали этот новый поток) join () для этого потока. Если по истечении заданного тайм-аута этот поток не «присоединяется», вы можете игнорировать (обнулить) этот поток. Это даст вам дополнительную функциональность, добавив тайм-аут для блокировки потока.

0
ответ дан 4 December 2019 в 22:26
поделиться

Я думаю, вам просто нужно закрыть соединение - так что просто сделайте scn полем потока и реализуйте:

public void stop() {
  scn.close();
}

и закодируйте свой основной метод для корректного завершения на IOException или другое указание на то, что вы закончили (как вы, вероятно, уже сделали).

0
ответ дан 4 December 2019 в 22:26
поделиться

В вашем основном потоке (когда вы хотите завершить принимающий поток) вызовите scn.close () . Затем acceptAndOpen должен вызвать исключение IOException , которое вы можете перехватить, а затем корректно завершить поток accept.

ServerSocketConnection scn =
    (ServerSocketConnection) Connector.open("socket://:1234");

Thread t = new Thread(){
    public void run(){
        // Wait for a connection.
        try {
            SocketConnection sc = (SocketConnection) scn.acceptAndOpen();
            //do other operation
        } catch (IOException e) {
            // Log the exception
        }
    }
};

t.start();

// ...

// Somewhere else...
// Cancel the acceptAndOpen.
scn.close();

Хорошей идеей было бы ввести механизм синхронизации , чтобы вы не закрывали сокет сразу после того, как acceptAndOpen прошел.

0
ответ дан 4 December 2019 в 22:26
поделиться

Вызовите Thread.interrupt(). Операции блокировки обычно вызывают исключение InterruptedException, если Thread, в котором они выполняются, прерывается.

0
ответ дан 4 December 2019 в 22:26
поделиться
Другие вопросы по тегам:

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