❶ java 线程有哪些状态,这些状态之间是如何转化的
线程在它的生命周期中会处于各种不同的状态:
新建、等待、就绪、运行、阻塞、死亡。
1 新建
用new语句创建的线程对象处于新建状态,此时它和其他java对象一样,仅被分配了内存。
2等待
当线程在new之后,并且在调用start方法前,线程处于等待状态。
3 就绪
当一个线程对象创建后,其他线程调用它的start()方法,该线程就进入就绪状态。处于这个状态的线程位于Java虚拟机的可运行池中,等待cpu的使用权。
4 运行状态
处于这个状态的线程占用CPU,执行程序代码。在并发运行环境中,如果计算机只有一个CPU,那么任何时刻只会有一个线程处于这个状态。
只有处于就绪状态的线程才有机会转到运行状态。
5 阻塞状态
阻塞状态是指线程因为某些原因放弃CPU,暂时停止运行。当线程处于阻塞状态时,Java虚拟机不会给线程分配CPU,直到线程重新进入就绪状态,它才会有机会获得运行状态。
6 死亡状态
当线程执行完run()方法中的代码,或者遇到了未捕获的异常,就会退出run()方法,此时就进入死亡状态,该线程结束生命周期。
由于java线程调度不是分时的,如果程序希望干预java虚拟机对线程的调度过程,从而明确地让一个线程给另外一个线程运行的机会,可以采用以下的方法
1 调整各个线程的优先级
2 让处于运行状态的线程调用Thread.sleep(long time)方法 放弃CPU 进入阻塞状态。
sleep方法可能抛出InterruptedException
线程休眠后只能在指定的时间后使线程处于就绪状态。(也就是等待cpu的调度)
3 让处于运行状态的线程调用Thread.yield()方法 只会同优先级让步或更高优先级让步,进入就绪状态。
4 让处于运行状态的线程调用另一个线程的join()方法
当前运行的线程可以调用另一个线程的join()方法,当前运行的线程将转到阻塞状态,直至另一个线程运行结束,它才会转到就绪状态 从而有机会恢复运行。
通过一下几种途径中的一种,线程可以从被阻塞状态到可运行状态。
1 线程被置于睡眠状态,且已经经过指定的毫秒数。
2 线程正在等待I/O操作的完成,且该操作已经完成。
3 线程正在等待另一个线程所持有的锁,且另一个线程已经释放该锁的所有权;(也有可能等待超时。当超时发生时,线程解除阻塞。)
4 线程正在等待某个触发条件,且另一个线程发出了信号表明条件已经发生了变化。(如果为线程的等待设置了一个超时,那么当超时发生时该线程将解除阻塞。)
5 线程已经被挂起,且有人调用了它的resume方法。不过,由于suspend方法已经过时,resume方法也就随之被弃用了,你不应该在自己的代码里调用它。(现在应该用sleep取而代之。)
❷ java线程join释放锁
主函数也是一个线程(主线程) 如果你join的位置在主函数里面那么理论上是会等那个线程运行完毕才继续往下走
❸ java线程结束会自动释放资源,图片中红框框中的代码是不是可以省略
ServerSocket中封装了socket、bind、listen等操作,这些操作都是占用系统内部资源的,如果不执行close,内部资源无法通过gc释放,gc没有传说中那么牛叉。
❹ java 线程同步中LOCK释放问题
问问题要把自己疑惑的地方明确的说出来,不然谁知道你想问什么。
lock.notify();作用是唤醒等待的线程。
lock.wait();作用是使当前线程进入等待,一直到该lock被notify
你执行以下下面的代码就明白了。
publicclassPrintNum{
privatebyte[]lock=newbyte[0];
PrintThreada=newPrintThread("a");
PrintThreadb=newPrintThread("b");
publicvoiddemo(){
a.start();
b.start();
}
publicvoidprintState(){
System.out.println("astate:"+a.getState());
System.out.println("bstate:"+b.getState());
}
classPrintThreadextendsThread{
publicPrintThread(Stringname){
this.setName(name);
}
@Override
publicvoidrun(){
synchronized(lock){
for(inti=0;i<100;i++){
printState();//控制台输出线程状态
lock.notify();//位置1,程序可正常执行结束
if(i%10==0&&0!=i){
try{
//lock.notify();
//位置2,程序执行到a:99,b:99后无法正常结束
lock.wait();
//位置3,程序执行到a:9,b:9后无法继续执行
}catch(InterruptedExceptione){
e.printStackTrace();
}
}
System.out.println(this.getName()+":"+i);
}
}
}
}
publicstaticvoidmain(String[]args){
PrintNumprintNum=newPrintNum();
printNum.demo();
}
}
❺ java中一个线程什么时候释放资源啊问题补充中是我情况的说明.
启一个 eclipse 就有一个javaw.exe 一直在运行。你也说了那是进程。进程可以包含很多线程的。而且线程完毕,但是你的进程却一直开着。不信你杀死javaw 进程。看看你的Myeclipse或者是 eclipse 还有么。
❻ java threadlocal线程结束会释放当前线程的数据吗
不会清空,要你自己去清空。
只有当ThreadLocal的颤肢茄生命周期受限于Task的生命周期时,在Thread Pool的Thread里使用ThreadLocal才有意义。
Task指的是一个Thread所执行的任务。总之,如果你能够在使用ThreadLocal的时候管理它的创建、销毁,那么就可以用,否则会出问题。原因是ThreadLocal是和Thread绑定的,饥橡如果Thread是从Thread Pool中拿出来的,那么意味着Thread可能会被复用,如果茄察被复用,你就一定得保证这个Thread上一次结束的时候,其关联的ThreadLocal被清空掉,否则就会串到下一次使用。
❼ java threadlocal 线程结束会释放当前线程的数据吗
after a thread goes away, all of its copies of thread-local instances are
subject to garbage collection (unless other references to these copies exist).
官方解释,翻译一下就是:
在线程消失之后,其线程局部实例的所有副本都会被垃圾回收(除非存在对这些副本的其他引用)。
❽ java线程同步的问题,究竟线程在什么时候释放锁
可以肯定的说,执行完同步代码块 立即释放 而与run方法没有关系
你这个结果应该是随机的
f()执行完释放this锁,被哪个线程拿到是随机的
❾ 如何手动释放一个java线程占用的资源
你写的是while true,而且代码块里面没有跳出的语句,也就是说,除非发生异常,否则该线程将一直在这个死循环中运行。