如何手动释放一个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端口没有释放掉

建议你声明一个boolean变量替换while(true)中的true,因为这样就可以控制线程了,然后不必等到主程序结束 参考技术A 你写的是while true,而且代码块里面没有跳出的语句,也就是说,除非发生异常,否则该线程将一直在这个死循环中运行。 参考技术B while里面不要用true,用用变量代替,就可以控制线程的运行与否。或者将socket对象设置为全局,那样就可以手动改变此socket的属性。

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 啥资源需要手动释放

java httpclient httpget不关闭,会占用线程吗

Java多线程-死锁

Java并发编程:线程间协作的两种方式:waitnotifynotifyAll和Condition

查看Java哪个线程占用CPU资源