У меня есть поток:
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? Как я могу его убить?
Thread.interrupt ()
не будет , а не прерывать поток, заблокированный на сокете. Вы можете попробовать вызвать Thread.stop ()
или Thread.destroy ()
, но эти методы устарели (править: на самом деле отсутствует в J2ME) и в некоторых случаях не работает, по причинам, вы можете прочитать о здесь .Как упоминается в этой статье, лучшим решением в вашем случае является закрытие сокета, который вы блокируете:
В некоторых случаях вы можете использовать специальные уловки для приложения. Например, если поток ожидает на известном сокете, вы можете закрыть сокет, чтобы поток немедленно вернулся. К сожалению, на самом деле не существует какой-либо техники, которая бы вообще работала. Следует отметить, что во всех ситуациях, когда ожидающий поток не отвечает на Thread.interrupt, он также не отвечает на Thread.stop. К таким случаям относятся преднамеренные атаки типа «отказ в обслуживании» и операции ввода-вывода, для которых thread.stop и thread.interrupt не работают должным образом.
Вы можете вызвать thread.interrupt ()
. Это вызовет исключение InterruptedException
в вашем потоке
Сделайте основной поток МОНИТОР НИТИ (откуда вы создали этот новый поток) join () для этого потока. Если по истечении заданного тайм-аута этот поток не «присоединяется», вы можете игнорировать (обнулить) этот поток. Это даст вам дополнительную функциональность, добавив тайм-аут для блокировки потока.
Я думаю, вам просто нужно закрыть соединение - так что просто сделайте scn
полем потока и реализуйте:
public void stop() {
scn.close();
}
и закодируйте свой основной метод для корректного завершения на IOException
или другое указание на то, что вы закончили (как вы, вероятно, уже сделали).
В вашем основном потоке (когда вы хотите завершить принимающий поток) вызовите 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 прошел.
Вызовите Thread.interrupt(). Операции блокировки обычно вызывают исключение InterruptedException, если Thread, в котором они выполняются, прерывается.