关闭由ServerSocket阻塞的线程的一种方法

关闭由于serverSocket监听阻塞住的线程,对于未阻塞的线程简单的设置一个变量stop,每次轮询检测stop的值即可,但是这对于被阻塞的线程是行不通的。由于被阻塞住,根本无法检测stop变量的值。

方法

程序提供了closeClient()方法,在这个方法中,首先设置stop变量为true,然后与本serverSocket建立链接,建立之后立即关闭。这样在run方法中的serverSocket由于接受了链接,便打破了阻塞的状态,打破阻塞后,立即检测stop变量,在检测完stop变量前不能使用socket。因为socket建立完立刻就被关闭了。如果检测到stop变量为true,那么关闭资源,跳出循环。如果stop变量为false,那么就做正常的处理。因此在构造方法中,需要将stop变量初始化为false。

下面是关键的代码段
	public void run() {
		while(true) {
			if(stop) {
				break;
			}
			try {
				Socket socket = this.serverSocket.accept();
				if(!stop) {
					// do something.....
				}else {
					this.serverSocket.close();
					System.out.println("server socket close");
					break;
				}
			} catch (IOException e) {
				e.printStackTrace();
			}
		}
	}
	
	public void closeClient(){
		this.stop = true;
		try {
			new Socket(ip, port).close();
		} catch (IOException e) {
			e.printStackTrace();
		}
	}
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值