如何手动释放一个java线程占用的资源
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何手动释放一个java线程占用的资源相关的知识,希望对你有一定的参考价值。
我做一个聊天软件 我双击一个好友头像时 执行一个线程 弹出一个窗口 线程里 run方法是用来接收信息的,但是当我把当前窗口关掉想再一次打开时,却提示端口被占用
我找到了地方是上一个窗口弹出的时执行的线程里面占用着10000这个端口 我没有停掉上一个窗口的线程,所以上一个窗口占用的那个10000的端口没有释放掉
那么请问大神们 如何手动停止线程,并且释放掉run方法里面占用的端口
因为run方法里面有DatagramSocket类的receive方法,这个是阻塞式的没有接受到信息就不会往下执行,所以所占用的端口没有释放掉
大神们 要如何释放掉哇?
public void run()
try
while(true)
DatagramSocket ds=new DatagramSocket(10000);
byte buffer[]=new byte[1024*64];
DatagramPacket dp=new DatagramPacket(buffer,buffer.length);
System.out.println("OK1");
ds.receive(dp);
System.out.println("OK2");
String mess=new String(dp.getData(),0,dp.getLength());
Date d=new Date();
SimpleDateFormat sdf=new SimpleDateFormat("yyyy-MM-dd kk:mm:ss ");
String str=sdf.format(d);
recArea.append(str+"\n");
recArea.append(mess+"\n");
ds.close();
catch(Exception e)
System.out.println(e.getMessage());
线程里面的run方法
就是 DatagramSocket ds=new DatagramSocket(10000);这句占用着10000端口没有释放掉
java面试-synchronized与lock有什么区别?
1、原始构成:
synchronized是关键字,属于JVM层面,底层是由一对monitorenter和monitorexit指令实现的。
ReentrantLock是一个具体类,是API层面的锁。
2、使用方法:
synchronized不需要用户手动释放锁,当synchronized代码块执行完成后,系统会自动让线程释放对锁的占用
ReentrantLock需要用户手动释放锁,若没有手动释放可能导致死锁现象。
3、等待是否可中断:
synchronized不可中断,除非抛出异常或者正常运行完成
ReentrantLock可中断
4、加锁是否公平:
synchronized非公平锁
ReentrantLock两者都可以,默认是非公平锁。
5、锁绑定多个条件Condition:
synchronized没有。
ReentrantLock可用来分组唤醒需要唤醒的线程。而不是像synchronized要么随机唤醒一个线程,要么唤醒所有线程。
以上是关于如何手动释放一个java线程占用的资源的主要内容,如果未能解决你的问题,请参考以下文章
java中一个线程啥时候释放资源啊?问题补充中是我情况的说明.
java httpclient httpget不关闭,会占用线程吗