Java线程关闭的3种方法
Java线程关闭,总的来说有3种:
1.使用状态位,这个简单,就不多说了:
publicclassTaskextendsThread{
privatevolatilebooleanflag=true;
publicvoidstopTask(){
flag=false;
}
@Override
publicvoidrun(){
while(flag){
/*doyourno-blocktask*/
}
}
}
2.当线程等待某些事件发生而被阻塞,又会发生什么?当然,如果线程被阻塞,它便不能核查共享变量,也就不能停止。这在许多情况下会发生,例如调用Object.wait()、Thread.sleep等,这里仅举出一些。他们都可能永久的阻塞线程。即使发生超时,在超时期满之前持续等待也是不可行和不适当的,所以,要使用某种机制使得线程更早地退出被阻塞的状态。这个时候你可以使用
Thread.interrupt();
publicclassBlockTaskextendsThread{
@Override
publicvoidrun(){
try{
while(!Thread.interrupted()){
/*doyourblocktask*/
}
}catch(Exceptione){
e.printStackTrace();
}
}
}
但是上面的代码或许有些不妥,或许用例子更能把问题说清楚。你怎么知道该代码段会发生阻塞?interrupt()函数到底是什么意思呢?首先说明的是,interrupted()方法只能解决跑出InterruptedException异常的阻塞。而interrupt()并不是关闭阻塞线程,而是解除阻塞。那这里就举出一个关闭线程阻塞的例子:
publicclassBlockTaskextendsThread{
@Override
publicvoidrun(){
try{
sleep(10000);
}catch(InterruptedExceptione){
System.out.println("ifyoutuseinterruptyouwillseeme");
}
}
publicstaticvoidmain(String[]args)throwsException{
//TODOAuto-generatedmethodstub
BlockTasktask=newBlockTask();
task.start();
Thread.sleep(1000);
task.interrupt();
}
}
3.上面说了,interrupt()只能解决InterruptedException的阻塞的线程,那么遇到一些其他的io阻塞怎么处理呢?这个时候java都会提供相应的关闭阻塞的办法。例如,服务器可能需要等待一个请求(request),又或者,一个网络应用程序可能要等待远端主机的响应,这个时候可以使用套接字close()方法
publicclassSocketTaskextendsThread{
privatevolatileServerSocketserver;
publicvoidstopTask(){
try{
if(server!=null){
server.close();
System.out.println("closetasksuccessed");
}
}catch(IOExceptione){
System.out.println("closetaskfailded");
}
}
@Override
publicvoidrun(){
try{
server=newServerSocket(3333);
}catch(IOExceptione){
e.printStackTrace();
}
}
publicstaticvoidmain(String[]args)throwsInterruptedException{
SocketTasktask=newSocketTask();
task.start();
Thread.sleep(1000);
task.stopTask();
}
}
相关文章
- java 四舍五入运算_JAVA正确的四舍五入方法「建议收藏」
- java反转数组_Java实现数组反转翻转的方法实例
- java循环语句_Java中的循环语句
- java和c语言哪个简单_Java编程和C语言哪个好学
- Java Random nextInt()方法与示例[通俗易懂]
- 【说站】BigDecimal值在java比较的两种方法
- java定时器实例_Java定时器小实例
- java 获取当前时间的三种方法_java获取单层文件夹大小
- callable线程使用_java线程结束用什么方法
- Java截取字符串方法_java通过split截取字符串
- JAVA生成uuid_java接口default方法
- 【Android NDK 开发】JNI 线程 ( JNI 线程创建 | 线程执行函数 | 非 JNI 方法获取 JNIEnv 与 Java 对象 | 线程获取 JNIEnv | 全局变量设置 )
- 【Groovy】Groovy 方法调用 ( Java 中函数参数是接口类型 | 函数参数是接口类型 可以 直接传递闭包 )
- Java 图片合并类详解编程语言
- 利用Redis存储Java对象的方法(redis存储java对象)
- Java非线程安全问题的解决方法
- Java Map.containsValue()方法:判断Map集合中是否包含指定的键值
- 解决Linux下重启Java程序的方法(linux重启java)
- 使用Java连接Linux服务器的简单方法(java连接linux)
- Java设置Redis过期时间的简单方法(redisjava过期)
- Java和Redis的配合安装方法(java redis安装)
- Linux下Java命令的使用方法简介(linux下java命令)
- Java数据库之MySQL学习使用教程(mysql中java教程)
- Java编程与Oracle技术创造技术价值的奥秘(java编程oracle)
- java线程之使用Runnable接口创建线程的方法
- 解析Java线程同步锁的选择方法
- Java进制转换的方法