线程创建的三种方法
Thread
Runnable
FutureTask
三种线程实现及对比
线程的等待与唤醒
wait notify
//上锁
synchronized(obj){
while(不满足条件){
obj.wait()
}
}
// 唤醒
obj.notify() / notifyAll()
等待线程执行终止的join
用于等待某些条件执行后再执行的逻辑
Thread thread1 = new Thread(new Runnable() {
@Override
public void run() {
System.out.println("条件1");
}
});
Thread thread2 =new Thread(new Runnable() {
@Override
public void run() {
System.out.println("条件2");
}
});
thread1.start();
thread2.start();
try {
thread1.join();
thread2.join();
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("cccc");
线程睡眠sleep
//暂时让出指定时间的执行权,不参与cpu调度,但是该线程拥有的监视器资源比如锁还是持有不让出的
Thread.sleep(xxx)
//调用线程的 interrupt 方法会抛出 interruptExpection 异常
thread.interrupt
让出CPU的执行权yield
// 当一个线程调用yield 方法时,当前线程会让出CPU使用权,然后处于就绪状态
// 线程调度器会从就绪队列中获取一个线程优先级最高的线程,然后也有可能会调度到刚刚让出CPU的线程
Thread.yield()
线程中断
- interrupt:中断线程,只是设置了线程中断位并不会真正的中断线程,需要自己拿到中断位进行操作
- isInterrupted:判断是否被中断(即中断标志是否为true),如果中断则返回true
- interrupted:判断是否中断,和上边的方法不同处在于其会清楚线程中断标志,并且为static 方法,调用的是currentThread() 的方法
守护线程与用户线程
Java 中的线程分为两种:守护线程和用户线程。JVM会在最后一个非守护线程执行完后退出,而不关注是否还有守护线程在执行,也就是说守护线程是否结束不影响JVM退出
// 设置为守护线程
thread.setDaemon(true);
网友评论