第一章 暂停线程
1.暂停方法1: suspend()挂起线程->resume()继续执行
区别于stop()方法的销毁线程,如果想继续线程的运行必须start重启线程.suspend()只是让线程挂起,主线程任然执行,挂起的线程通过resume()即可继续执行.
suspend()与resume()缺点1:独占
如果忘记了thread1.suspend()之后thread1.resume(),这个thread1就会永远suspend挂起状态,独占锁无法释放.并且由于独占,main方法从上往下执行(也可能被卡住),thread1挂起
main:
MyThread thread1=new MyThread();
thread1.start();
Thread.sleep(2000)
thread1.suspend();
System.out.Println("main end");
MyThread(thread1):
run(){
while(true){
i++;
System.out.Println(i);
}
}
System.out.Println(i)中的Println:
public void println(long x){
synchronized(this){
print(x);
newLine();
}
}
这里由于 thread1被suspend了,所以MyThread中的Println暂停,锁未释放,这里的this锁指向的是Println所在类.thread1被suspend了,但是main依然要执行,但是当main执行到System.out.Println("main end");时,Println也要获取thread1中独占的Println所在类的this锁,这时候main获取不到锁也会blocked,无法输出main end
suspend()与resume()缺点2: 数据不完整
如果线程setValue过程中suspend(),那么赋值操作将不具有原子性
2.yield()方法
放弃当前CPU资源,让其他任务占用CPU资源,可能刚放弃就重新获取CPU资源
3.线程优先级
优先级Priority分为1-10
优先级继承性:线程A启动B,则B优先级和A相同
优先级随机性:并不一定优先级高的都全部执行完,只是大概率分布在高优先级的先执行完而已
这本书略基础,就极致缩减了,后期有好文章再吸收后增加内容