在Java上,启动一个线程容易,让一个线程不断运行,也很容易,只要一个while循环,一直做死循环就行了。不过问题来了,那关闭线程怎么办?
先写个例子:
public class TestThread extends Thread { @Override public void run() { while(true){ System.out.println("一直运行"); try { sleep(3000); } catch (InterruptedException e) { e.printStackTrace(); } } } }
这样就可以让线程一直运行了,没错,这样是可以,让线程关闭的最好方法不是使用destroy方法,而是让线程自己结束。这个就是主动式关闭。所以一般都是这样处理一个线程:
public class TestThread extends Thread { private boolean flag = true; @Override public void run() { while(flag){ System.out.println("一直运行"); try { sleep(3000); } catch (InterruptedException e) { e.printStackTrace(); } } } public void stopThread(){ this.flag = false; } }
当这个线程正在运行时,可以用别的线程调用 stopThread()方法,这个时候flag就变成了false,循环结束,线程也就停止了!不过问题又来了,如果是线程里面是这样子的:你看怎么解决?
package cn.std.run.monitor; import java.io.IOException; import java.net.ServerSocket; import java.net.Socket; public class TestThread extends Thread { private boolean flag = true; @Override public void run() { try { ServerSocket serverSocket = new ServerSocket(50001); Socket socket = null; while (flag) { socket = serverSocket.accept(); //SocketCtrlHandler.processRequest(socket);此处对Socket处理 } } catch (IOException e) { e.printStackTrace(); } } public void stopThread(){ this.flag = false; } }
这个时候,stopThread方法就不行了,因为在
socket = serverSocket.accept();
处,程序会一直堵塞,就像是在循环里面停止了一样,只有等到新的Socket连接进来了,才能不再堵塞。
于是解决办法又有了:
package cn.std.run.monitor; import java.io.IOException; import java.net.ServerSocket; import java.net.Socket; import java.net.UnknownHostException; public class TestThread extends Thread { private boolean flag = true; @Override public void run() { try { ServerSocket serverSocket = new ServerSocket(50001); Socket socket = null; while (flag) { socket = serverSocket.accept(); //SocketCtrlHandler.processRequest(socket);此处对Socket处理 } } catch (IOException e) { e.printStackTrace(); } } public void stopThread(){ this.flag = false; try { new Socket("localhost",50001); } catch (UnknownHostException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } } public static void main(String[] args) throws InterruptedException { TestThread tt = new TestThread(); tt.start(); sleep(3000); tt.stopThread(); } }
在stopThread方法里面new Socket,让线程不再堵塞,进入下一个循环,但是进入下一个循环判断的时候已经变为false,循环结束,线程停止!
那再来一个例子,线程等待队列:
package cn.std.run.monitor; import java.io.IOException; import java.net.ServerSocket; import java.net.Socket; import java.net.UnknownHostException; import java.util.LinkedList; public class TestThread extends Thread { private boolean flag = true; private LinkedList<Object> pool = new LinkedList<Object>(); public void add(Object obj){ synchronized (pool) { pool.add(obj); pool.notify(); } } @Override public void run() { Object obj = null; while(flag){ synchronized (pool) { while(pool.isEmpty()){ try { pool.wait(); } catch (InterruptedException e) { e.printStackTrace(); } } obj = pool.remove(0); } dispose(obj); } } public void dispose(Object obj){ System.out.println(obj); } public void stopThread(){ this.flag = false; } public static void main(String[] args) throws InterruptedException { TestThread tt = new TestThread(); tt.start(); sleep(3000); tt.stopThread(); } }
这是一个经常使用的线程排队,如果这时候stopThead不做特殊处理,也不能成功关闭线程,
得这样才行:
public void stopThread(){ this.flag = false; add(""); }
原理跟上面的ServerSocket堵塞一样,这个就是我说的主动式关闭!好吧,再加一句,原谅我菜,呵呵~~
相关推荐
ServerSocket的close()方法使...当一个服务器程序运行结束时,即使没有执行ServerSocket的close()方法,操作系统也会释放这个服务器占用的端口。因此,服务器程序并不一定要在结束之前执行ServerSocket的close()方法
clientsocket and serversocket
本资源是java中socket与serverSocket连接的例子,包括客户端和服务器端的程序代码
Socket/ServerSocket构架的多个客户端在线聊天系统 1.多线程 2.对象传送 3.客户端管理 4.线程同步
ServerSocket服务端与客户端通信DEMO,讲述如何使用多线程的方式,使得多个客户端与服务端通信。
serversocket单线程跟多线程例子,很值得学习的
Java 实例 - ServerSocket 和 Socket 通信实例源代码+详细指导教程.zip
socket和serversocket利用IO流编写的多线程连接相互发送消息
java 实现绘制指针时钟 和多线程服务器java 实现绘制指针时钟 和多线程服务器java 实现绘制指针时钟 和多线程服务器java 实现绘制指针时钟 和多线程服务器java 实现绘制指针时钟 和多线程服务器java 实现绘制指针...
serversocket web服务器
描述如何在WEB服务器启动时加载一个Java ServerSocket服务,单机程序也可借鉴
ServerSocket实现一个简单的Web服务器demo
有关java线程循环和serversocket和socket的程序.pdf
一个简单的Android平台的ServerSocket样例。同一个局域网的手机可以通讯
有关java线程循环和serversocket和socket的程序借鉴.pdf
有关java线程循环和serversocket和socket的程序分享.pdf
多个示例代码资源,解释代码。对于刚入门学serversocket的人来说,更容易接受
Socket+ServerSocket代码
tserversocke 多线程 通信
socket server关闭时导致socket client也关闭 的原因及解决办法 tcp socket进程结束时,tcp socket客户端也会结束(崩溃)的原因及解决办法