1 java多线程技能
1.2.1 继承Thread类
Thread.java类中的start()方法通知“线程规划器”此线程已经准备就绪,等待调用线程对象的run()方法。
如果调用thread.run()就不是异步执行了,而是同步,那么此线程对象不会交给“县城规划器”来进行处理,而是由main主线程来调用run()方法。
另外,执行start()方法的顺序不代表线程的启动顺序。
1.2.3 实例变量和线程安全
当一个线程想要执行同步方法里面的代码时,线程首先尝试去拿这把锁,如果能够拿到这把锁,那么这个线程就可以执行synchronize里面的代码,如果不能拿到这把锁,那么这个线程就会不断尝试那这把锁,直到能够拿到为止,而且是有多个线程同时去争抢这把锁。
currentThread()方法
currentThread()方法可以返回代码正在被哪个线程调用的信息。
isAlive()方法
1.5 sleep()方法
方法sleep()的作用是在指定的毫秒数内让 当前正在执行的线程 休眠,这个”正在执行的线程”是指this.currentThread()返回的线程。
1.7.2 判读线程是否是停止状态
this.interrupted():测试当前线程是否已经是中端状态,
执行后具有将状态标志清楚为false的功能。 是static方法。
this.isInterrupted(): 测试线程Thread对象是否已经是中断状态,但不清楚状态标志。不是static方法。
1.7.3 能停止的线程 – 异常法
public class MyThread extends Thread{
@Override
public void run(){
super.run();
try{
for(int i=0;i<50000;i++){
if(this.interrupted()){
sys.out("已经是停止状态了,我要退出了!");
throw new InterruptedException();
}
}
}catch (InterruptedException e){
sys.out("进MyThread.java类run方法中的catch了!");
e.printStackTrace();
}
}
}
1.7.4 在沉睡中停止
如果在sleep状态下停止某一线程,会进入catch语句,并且清除停止状态值,使之变成false。
如果用interrupt停止线程时线程还没有进入sleep,那么线程将继续执行直到在遇到sleep的时候才进入catch语句。
1.8 暂停线程
可以使用suspend()方法暂停线程,使用resume()方法恢复县城的执行。
两个方法都已经被弃用,因为可能造成独占和不同步。
1.9 yield 方法
yield()方法的作用是放弃当前cpu资源,将它让给其他任务去占用cpu执行时间。但放弃的时间不确定,有可能刚刚放弃,马上又获得cpu时间。
1.10 线程优先级
设置线程优先级使用setPriority()方法。
在java中,线程的优先级具有继承性,比如A线程启动B线程,则B线程与A线程等级是一样的。
优先级具有规则性
优先级具有随机性
1.11 守护线程
当进程中不存在非守护线程时,则守护线程自动销毁。