最近碰到一个问题:如果 Thread 被阻塞到 IO 操作上时,主线程(即创建这个线程的线程)无法关闭此线程。
不知道各位大虾有没有解决方法。可是让主线程关闭子线程的... 谢谢大家...
不知道各位大虾有没有解决方法。可是让主线程关闭子线程的... 谢谢大家...
解决方案 »
- UDP传送图片,有点小问题怎么解决下。
- java有没有对线程堆栈的保存机制
- 在Hibernate里面的SessionFactory.getCurrentSession()与(Session)ThreadLocal.get()有什么区别。
- 关于java 数据类型
- 谁有JAVA2核心技术第1卷这本书第七版的配套示例压缩包?
- TreeSelectionListener的问题
- 问几个入门小问题,大家别笑话我!!
- 要学习 java了,那位老鸟介绍基本 Java 的经典书籍
- 请教如何通过循环生成控件?如何显示事件触发后生成的控件?可以这样写吗(见内)?谢谢!
- 很简单程序的编译出错,问题在哪里?请指教
- 这个公司能去吗?
- 谁知道 java2 参考大全的代码在哪里可以下到啊?
普通的关闭可以如下:public void run()
{
while(true)
{
//do something
try
{
sleep(1000);
}
catch(InterruptException ex)
{
break; // 当父线程调用该线程的interrupt方法时,抛出异常后,break
}
}}如果在 do something 的时候被 IO 操作阻塞,则父线程使用 interrupt 方法时,没有任何效果。即不能正常关闭线程执行。我想看看大家有什么办法,可以使得父线程可以在任意时刻将子线程关闭。
不见得吧?
import java.util.*;class CanStop extends Thread{
private volatile boolean stop = false;
private int counter =0;
public void run(){
while(!stop && counter <10000){
System.out.println(counter++);
}
if(stop){
System.out.println("Deteced stop");
}
}
public void requestStop(){stop =true;}
}public class Stopping{
public static void main(String[] args){
final CanStop stoppable = new CanStop();
stoppable.start();
new Timer(true).schedule(new TimerTask(){
public void run(){
System.out.println("Requesting stop");
stoppable.requestStop();
}
},510);
}
}
线程陷入阻塞的i/o操作中,一般是没有办法响应外部的操作的(至少我是不知道),stop之类的形同虚设。后来找遍jdoc。关于socket类中有一点点小小的说明。说处于listen ,Accept等函数中时关闭
socket就会有一个关于socket的异常抛出。才算抓到一根救命稻草。
说句不负责的话(没有经过测试),道理应该是一样的吧。在没有提供给外部通讯(比如中断,消息等)的情况下。破坏阻塞操作针对的对象,让阻塞操作异常。从而跳出阻塞。应该是可行的。
java的网络的异步io好像是 Selector
不过我没有用过,我们的模型不是这样子的,如果改成那样子的话开发成本太高。
如果需要可以,偶可以帮你看看文档。
{
public void run()
{
System.out.println("Starting loop");
while(true){
if(this.interrupted())
break;
}
System.out.println("End loop");
}
}
public class TestClass
{
public static void main(String args[]) throws Exception
{
AA a = new AA();
a.start();
Thread.sleep(2000);
a.interrupt();
}
}