java中一个线程啥时候释放资源啊?问题补充中是我情况的说明.

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了java中一个线程啥时候释放资源啊?问题补充中是我情况的说明.相关的知识,希望对你有一定的参考价值。

以下是我线程的定义:(analyzing成员函数太多我省略了)
public class analyzingCommand extends Thread
static boolean tag=true;
connection con=new connection();

public void run()
while(tag)
while(0<con.getCommand().size())
this.analyzing(con.getCommand().get(0).toString());
System.out.println(con.getCommand().get(0).toString()+"cnx");
con.removeCommand(0);

System.out.print("..");


public void startAnalylyzing()
tag=true;

public void stopAnalyzing()
tag=false;



下面是我的测试函数:
public static void main(String [] args)
connection con=new connection();
analyzingCommand ac=new analyzingCommand();
ac.start();
con.setCommand("*1*,2012/6/27 12:09:09,255.255.255.254,1,13,1");
Timer t=new Timer();
t.schedule(new MyTask1(), 5*1000);
t.schedule(new MyTask2(), 10*1000);
while(true)//这个是用来停止此任务的,否则就一直循环执行此任务了
try
int ch = System.in.read();
if(ch-'c'==0)
t.cancel();//使用这个方法退出任务

catch (Exception e)
// TODO Auto-generated catch block
e.printStackTrace();



static class MyTask1 extends java.util.TimerTask
@Override
public void run()
// TODO Auto-generated method stub
System.out.println(new connection().getAnswer().get(0));


static class MyTask2 extends java.util.TimerTask
@Override
public void run()
// TODO Auto-generated method stub
new analyzingCommand().stopAnalyzing();


10秒之后我看我的资源管理器,还有一个javaw进程,没有占用cpu,但是内存还占着。
一个线程是不是执行完run()就算是结束了啊,这个时候他会释放资源吗?

参考技术A 简单的说,多线程是通过获取CPU的片刻时间来实现的,多个线程其实不是同步的,只是他们的执行间隔太短,人几乎感觉不到。这是基本概念。主线程(主体)在子线程未完成前事不会结束的,子线程(通过Thread产生的线程)start后,执行run()方法,执行run()后,该线程结束,系统自动释放该线程占用的资源,但主线程仍在运行!追问

那主线程怎么停止呢,怎么样才能让他释放内存。

追答

主线程执行完任务才能停止,不过可以暂停,用sleep();来暂停!(参数数时间以毫秒为单位)

参考技术B 你说 你在资源管理器上看的是 进程还是线程。

你开启一个 eclipse 就有一个javaw.exe 一直在运行。
你也说了那是进程。进程可以包含很多线程的。而且线程完毕,但是你的进程却一直开着。不信你杀死javaw 进程。看看你的Myeclipse或者是 eclipse 还有么。追问

资源管理器看到的应该是进程吧,杀了还有,而且我运行几遍我写的程序就有几个javaw.exe进程,我是用的myeclipse

追答

资源管理器看到的确实是进程!
但是不对啊。javaw.exe 你还能起多个?那你还能起得来??
你把最大那个javaw.exe 杀死进程啊。
但是我只出现过两个javaw.exe 那是因为我Myeclipse 异常关闭。然后,再次打开的时候,没有打开。说是JVM被占用。你这个怎么能开启好多个javaw.exe 呢?

奇怪

本回答被提问者采纳
参考技术C 启一个 eclipse 就有一个javaw.exe 一直在运行。你也说了那是进程。进程可以包含很多线程的。而且线程完毕,但是你的进程却一直开着。不信你杀死javaw 进程。看看你的Myeclipse或者是 eclipse 还有么。 参考技术D 那个进程代表的是虚拟机,你的线程结束了。。但程序没结束当然不消失了追问

但是我的程序不是10秒之后输入“c”就会执行完main()结束的吗?

java锁-分类

一、锁分类

线程要不要锁住同步资源?
锁住--悲观锁
不锁住--乐观锁

锁住同步资源如果失败,线程要不要阻塞?
阻塞
不阻塞--自旋锁,适应性自旋锁

多个线程竞争同步资源的流程细节上的区别?
不锁住资源,多个线程中只有一个能够修改资源成功,其它线程会去重试--无锁
同一个线程执行同步资源时自动获取资源--偏向锁
多个线程竞争同步资源的时候,没有获取资源的线程通过自旋等待锁释放--轻量级锁
多个线程竞争同步资源的时候,没有获取资源的线程阻塞等待唤醒--重量级锁

多个线程竞争需不需要排队?
排队--公平锁
先尝试插队,插队失败再去排队--非公平锁

一个线程中的多个线程能不能获取同一把锁?
能--可重入锁
不能--非可重入锁

多个线程能不能共享同一把锁?
能--共享锁
不能--排他锁

以上是关于java中一个线程啥时候释放资源啊?问题补充中是我情况的说明.的主要内容,如果未能解决你的问题,请参考以下文章

java中是怎样进行垃圾回收的?

如何运行资源内的exe 以线程运行exe

java多线程,对象锁是啥概念?

File.ReadLines 啥时候释放资源

悲观锁和乐观锁,啥情况

C# kill线程正常释放资源?