当前位置: 技术问答>java相关
高分,关于线程的讨论(在线)
来源: 互联网 发布时间:2015-10-12
本文导语: java中线程共有四种状态:new,runnable,blocked,dead. 我的问题是: 1。线程运行结束,进入dead 状态,那么还能进入runnable状态吗? 2。线程在dead状态下,是否会释放所占用的资源,什么情况下进行。 | ...
java中线程共有四种状态:new,runnable,blocked,dead.
我的问题是:
1。线程运行结束,进入dead 状态,那么还能进入runnable状态吗?
2。线程在dead状态下,是否会释放所占用的资源,什么情况下进行。
我的问题是:
1。线程运行结束,进入dead 状态,那么还能进入runnable状态吗?
2。线程在dead状态下,是否会释放所占用的资源,什么情况下进行。
|
线程结束不能从新启动,除非新生成线程.释放资源由GC完成,只要是没有用的符合GC条件的,都release.
|
线程还有别的状态吗?
我系统内的线程不知道进入什么状态,连interrupt都不行,一直在占着cpu运行
我系统内的线程不知道进入什么状态,连interrupt都不行,一直在占着cpu运行
|
1。不能
2。会
2。会
|
老弟,你从哪里听说线程是这四种状态呀?
线程对于任何语言都一样的,它不属于语言的概念(只是java在语言级上支持多线程)。线程只有如下四种状态:运行,挂起(睡眠),就绪(等待),结束(死亡)。你说的dead就是最后一种,在java中有两种方式,一种是自然结束,一种强制dead,不过为了安全性和稳定性,最好只用第一种。线程运行完了并不代表线程类被回收了,你依然可以再用,再次运行就是。
另外,java中没有提供自行回收对象,这个是由它的垃圾回收器自动回收,你并不知道何时何地进行这样的处理。所以线程完毕,并不代表资源回收,当然除了数据库连接,网络连接,流连接可以close外(这个也要自己进行释放)。如果你不想多余太多的废弃的对象,你可以在结束后,将线程类的主要域设置为null,它们因为而成为弱引用对象,是优先被垃圾回收器回收的
好了,老弟,好好看看书,希望你成为高手
线程对于任何语言都一样的,它不属于语言的概念(只是java在语言级上支持多线程)。线程只有如下四种状态:运行,挂起(睡眠),就绪(等待),结束(死亡)。你说的dead就是最后一种,在java中有两种方式,一种是自然结束,一种强制dead,不过为了安全性和稳定性,最好只用第一种。线程运行完了并不代表线程类被回收了,你依然可以再用,再次运行就是。
另外,java中没有提供自行回收对象,这个是由它的垃圾回收器自动回收,你并不知道何时何地进行这样的处理。所以线程完毕,并不代表资源回收,当然除了数据库连接,网络连接,流连接可以close外(这个也要自己进行释放)。如果你不想多余太多的废弃的对象,你可以在结束后,将线程类的主要域设置为null,它们因为而成为弱引用对象,是优先被垃圾回收器回收的
好了,老弟,好好看看书,希望你成为高手
|
基本同意hh-fwhy的观点,但是
“线程运行完了并不代表线程类被回收了,你依然可以再用,再次运行就是。”
和
“线程类的主要域设置为null,它们因为而成为弱引用对象”
好像不太对,也可能使我理解错你的话了
第一句话是不是指t.start();等到t结束,还可以t.start()?
如果你是这样认为的话,那就错了,例子如下
class CCC
{
public static void main(String[] args)
{
T t = new T();
t.start();
//wait for a second till T dead
try
{
Thread.sleep(1000);
}
catch (Exception e) {System.out.println(e);}
t.start();
}
}
class T extends Thread
{
public void run()
{
System.out.println("Run called");
}
};
结果只有一个Run called打印出来,详情请参阅Core Java Volume 2 第 11 页图
第二句话,也很不解,原因有二
1.释放线程的各个域,应该是此线程的引址计数器为0,也就是说没有Thread的引用指像此线程,通常是t=null,而不是t.name=null;t.sex=null;t.age=null;.......
2.你说的弱引用应该是这个吧?
java.lang.Object
|
+--java.lang.ref.Reference
|
+--java.lang.ref.WeakReference
这是从JDK1.2开始引入的,WeakReference不会被对象引址计数器记录,所以就算这样的引用仍存在,只要没有普通引用,他就可以被释放。IBM developerworks有一片详述。你用在这里,“将线程类的主要域设置为null,它们因为而成为弱引用对象”我不太懂。
本人愚见,还请海纳
“线程运行完了并不代表线程类被回收了,你依然可以再用,再次运行就是。”
和
“线程类的主要域设置为null,它们因为而成为弱引用对象”
好像不太对,也可能使我理解错你的话了
第一句话是不是指t.start();等到t结束,还可以t.start()?
如果你是这样认为的话,那就错了,例子如下
class CCC
{
public static void main(String[] args)
{
T t = new T();
t.start();
//wait for a second till T dead
try
{
Thread.sleep(1000);
}
catch (Exception e) {System.out.println(e);}
t.start();
}
}
class T extends Thread
{
public void run()
{
System.out.println("Run called");
}
};
结果只有一个Run called打印出来,详情请参阅Core Java Volume 2 第 11 页图
第二句话,也很不解,原因有二
1.释放线程的各个域,应该是此线程的引址计数器为0,也就是说没有Thread的引用指像此线程,通常是t=null,而不是t.name=null;t.sex=null;t.age=null;.......
2.你说的弱引用应该是这个吧?
java.lang.Object
|
+--java.lang.ref.Reference
|
+--java.lang.ref.WeakReference
这是从JDK1.2开始引入的,WeakReference不会被对象引址计数器记录,所以就算这样的引用仍存在,只要没有普通引用,他就可以被释放。IBM developerworks有一片详述。你用在这里,“将线程类的主要域设置为null,它们因为而成为弱引用对象”我不太懂。
本人愚见,还请海纳
|
不是我给Horstmann做广告,你真该看看这本书,非常不错
不过机械工业出版社的老毛病,翻译太一般
不过机械工业出版社的老毛病,翻译太一般
|
假设P(producer)和C(Consumer)同时操作缓冲区,而且方法是同步的
如果P发现缓冲区慢,用wait() block自己,把自己放入等待队列。让C有机会去取。C取完之后,告诉P,你可以继续生产。
如果C发现缓冲区空,用wait() block自己,把自己放入等待队列。让P有机会去放。P放完之后,告诉C,你可以继续取。
双方都要notify(),或者notiryAll()
则此例中,notify和notifyAll一样
在多个线程的情况下,notifyAll更好一些,
有个例子
public class ThreadTest
{
final static int maxOperations = 20;
static int operatons = 0;
WareHouse warehouse = new WareHouse();
Producer pro = new Producer();
Consumer con = new Consumer();
public static void main(String[] args)
{
ThreadTest test = new ThreadTest();
test.beginTest();
}
public void beginTest()
{
pro.start();
con.start();
}
class Producer extends Thread
{
int operations = 0;
public void run()
{
System.out.println("Producer started");
try
{
while(operations
如果P发现缓冲区慢,用wait() block自己,把自己放入等待队列。让C有机会去取。C取完之后,告诉P,你可以继续生产。
如果C发现缓冲区空,用wait() block自己,把自己放入等待队列。让P有机会去放。P放完之后,告诉C,你可以继续取。
双方都要notify(),或者notiryAll()
则此例中,notify和notifyAll一样
在多个线程的情况下,notifyAll更好一些,
有个例子
public class ThreadTest
{
final static int maxOperations = 20;
static int operatons = 0;
WareHouse warehouse = new WareHouse();
Producer pro = new Producer();
Consumer con = new Consumer();
public static void main(String[] args)
{
ThreadTest test = new ThreadTest();
test.beginTest();
}
public void beginTest()
{
pro.start();
con.start();
}
class Producer extends Thread
{
int operations = 0;
public void run()
{
System.out.println("Producer started");
try
{
while(operations