请问:如果超过10s我就让线程停掉,该怎么做? interrupt()方法貌似不行OReilly.Java.Threads.3rd.Edition.Sep.2004.eBook-DDU.chm里有这么一句话,让我很费解: "the only way to terminate a thread is to arrange for its run() method to complete"问得好! 1)楼主请记住:JAVA的多线程是请求对方中止执行的,而不是强制对方停止执行的.尽管几乎所有的程序员都喜欢强制中止,喜欢想什么时候中止就什么时候中止,可惜事实上不是这样. 2)怎么办?那句您很费解的话,其实是很有名堂,也是很重要的一句话:其背后的思想是:既然是对方中止,因而说要求对方的run()代码要精心arrange,(即安排好run中代码比如:周期性或操作空余时间进行检测信号),目的是:当对方发出信息要求它终止时(可以是你定义的布尔变量,或干脆就用interrupt()产生的interrupted信号),能即时发现与中止(即:立即从run()方法中返回,常见的是用throw语句一下子从run()中嵌套很深的方法调用中一下子跳出run(),从而结束run()). 2)问题的真正核心是:当线程t处理不可中断的I/O操作时(如楼主的网络读取数据,超过10s时),是无法来检测信号的.因此:必须在你所进行的那种I/O操作中进行超时处理,以便线程t能有机会进行信号检测.如:对你的网络读取的I/O来说,你可以设计:conn.setReadTimeout(...),以及其它的根据你的需要进行的超时如:conn.setConnectTimeout(...)等. 3)另外:若System.exit(0),则所有的线程都结束了. 以上仅供你参考.
这句话的意思我理解为:
唯一的终止线程方法是让它的run方法执行完毕,也就是return.
public class T implements Runnable{
public static void main(String[] args) throws IOException {
Thread thread=new Thread(new T());
thread.start();
}
private URL url;
private HttpURLConnection conn;
public T() throws IOException {
url = new URL("http://www.250.com");
conn=(HttpURLConnection) url.openConnection();
}
public void breakConnection() {
conn.disconnect();
}
public void run() {
long start=System.currentTimeMillis();
System.out.println(start);
try {
System.out.println(conn.getContent());
} catch (IOException e) {
e.printStackTrace();
}finally{
System.out.println("耗时"+(System.currentTimeMillis()-start)+"毫秒");
}
}
}
那句话的表面意思,我看得懂,只是不明白它的深意。
比如“是不是一个线程start()后,你只能sleep(),yield()等,而不能停掉(或者说kill),
也就是说程序员不能终止线程”
暂停当前正在执行的线程对象,并执行其他线程。 void join(long millis)
等待该线程终止的时间最长为 millis 毫秒。
请问:如果超过10s我就让线程停掉,该怎么做?
interrupt()方法貌似不行OReilly.Java.Threads.3rd.Edition.Sep.2004.eBook-DDU.chm里有这么一句话,让我很费解:
"the only way to terminate a thread is to arrange for its run() method to complete"问得好!
1)楼主请记住:JAVA的多线程是请求对方中止执行的,而不是强制对方停止执行的.尽管几乎所有的程序员都喜欢强制中止,喜欢想什么时候中止就什么时候中止,可惜事实上不是这样.
2)怎么办?那句您很费解的话,其实是很有名堂,也是很重要的一句话:其背后的思想是:既然是对方中止,因而说要求对方的run()代码要精心arrange,(即安排好run中代码比如:周期性或操作空余时间进行检测信号),目的是:当对方发出信息要求它终止时(可以是你定义的布尔变量,或干脆就用interrupt()产生的interrupted信号),能即时发现与中止(即:立即从run()方法中返回,常见的是用throw语句一下子从run()中嵌套很深的方法调用中一下子跳出run(),从而结束run()).
2)问题的真正核心是:当线程t处理不可中断的I/O操作时(如楼主的网络读取数据,超过10s时),是无法来检测信号的.因此:必须在你所进行的那种I/O操作中进行超时处理,以便线程t能有机会进行信号检测.如:对你的网络读取的I/O来说,你可以设计:conn.setReadTimeout(...),以及其它的根据你的需要进行的超时如:conn.setConnectTimeout(...)等.
3)另外:若System.exit(0),则所有的线程都结束了.
以上仅供你参考.
那很简单啊:
url = new URL("http://www.250.com");
conn=(HttpURLConnection) url.openConnection();
conn.setConnectTimeout(10000);
conn.setReadTimeout(10000);
时间到了,会抛出异常,结束.
可以考虑在加个线程或者是用main线程.
setConnectTimeout和setReadTimeout,前者是设置建立连接的最大时间,后者是设置读取数据的最大时间,单位都是毫秒,超过这个时间,就会抛出异常,请查询JDK文档,catch到这个异常然后退出线程就OK了
请问怎么控制让他超过5s后就强行关掉!
awaitTermination(long timeout, TimeUnit unit) //超时时间
shutdown()
openConnection瞬间就完毕了,花时间的是connect方法以及读数据的方法,通过connect或者读数据之前的setConnectTimeout和setReadTimeout来设置超时退出时间。你想啊,你又不能介入URLConnection类的方法内部处理,从头到尾只调用一个方法,前面已经说得很清楚了,官方申明没有办法可以强行中止或杀死一个线程。除非你这个方法具体的实现上不停使用轮询或其他方法来监控是否需要自己return,事实上HttpURLConnection类的实现就是这么做的,只不过就是通过的setConnectTimeout,setReadTimeout来进行监控。前面已经说很清楚了,至于19楼的那个超时根本就是另外一回事