我有一个帖子:
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?我怎么能杀了它?
答案 0 :(得分:8)
Thread.interrupt()
将不中断在套接字上阻塞的线程。您可以尝试调用Thread.stop()
或Thread.destroy()
,但这些方法已被弃用(编辑:实际上,缺少在J2ME中)并且在某些情况下无法使用,原因是您可以阅读here。正如那篇文章所提到的,在你的情况下,最好的解决方案是关闭你阻塞的套接字:
在某些情况下,您可以使用特定于应用程序的技巧。例如,如果线程正在等待已知套接字,则可以关闭套接字以使线程立即返回。不幸的是,确实没有任何技术可以发挥作用。应该注意的是,在等待线程没有响应Thread.interrupt的所有情况下,它也不会响应Thread.stop。此类情况包括故意拒绝服务攻击,以及thread.stop和thread.interrupt无法正常工作的I / O操作。
答案 1 :(得分:0)
您可以致电thread.interrupt()
。这会在你的线程中抛出InterruptedException
答案 2 :(得分:0)
致电Thread.interrupt()。如果正在执行的InterruptedException被中断,则阻塞操作通常会抛出Thread。
答案 3 :(得分:0)
为此线程创建主线程 MONITOR THREAD (从此产生此新线程)join()。如果在给定的超时后,此线程不“加入”,则可以忽略(nullify)此线程。这将为您提供一个附加功能,为阻塞线程添加超时。
答案 4 :(得分:0)
在主线程中(当你想终止接受线程时)调用scn.close()
。然后acceptAndOpen
应抛出IOException
,您可以捕获它,然后优雅地终止接受线程。
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通过后立即关闭套接字。
答案 5 :(得分:0)
我认为你只需要关闭连接 - 所以只需将scn
作为线程的一个字段并实现:
public void stop() {
scn.close();
}
并将您的主要方法编码为优先退出IOException
或其他迹象表明您已完成(正如您可能已经拥有的那样)。
答案 6 :(得分:0)
我刚来到这个页面寻找相同的答案。我找到了一种关闭Threads的方法,这就是我要结束服务器的方法:
private Thread serverThread;
public void setUp(){
//Run the server
serverThread = new Thread() {
public void run() {
try {
new Server(); //it calls acceptAndOpen() here
} catch (IOException ex) {
ex.printStackTrace();
}
}
};
serverThread.start();
}
public void tearDown() {
serverThread = null;
System.gc();
}
基本上,将您对服务器线程的引用设为null,然后让垃圾收集器为您清理资源(这是您的服务器)。
请注意:这远非完美,我们永远不应该依赖gc来完成它的工作,但它似乎每次我尝试时都能正常工作