- 如何新建一个线程?
(1)通过继承Thread类,重写run方法;
(2)通过实现runable接口,重写run方法,然后作为target对象加入Thread;
(3)通过实现callable接口,重写call()方法,使用Future对象进行封装,然后将Future对象加入到Thread中 - 继承Thread和runnable接口有什么区别
继承 Thread 类:我们创建了三次 MyThread 对象,也就是创建了三个任务(工作四个小时这个任务)和三个线程(张三,李四和赵五三个人),每个线程去完成自己的任务;即多个线程分别完成自己的任务。
实现 Runnable 接口:我们创建了一个 MyRunnabld 对象(工作八个小时这个任务)和三个线程(张三,李四和赵五三个人);让这三个线程去共同完成一个任务;即多个线程共同完成一个任务。 - 线程状态是怎样转换的?
- 阻塞和等待的区别
阻塞是没有获取锁,等待是已经获取锁了,还要获取其他的资源
项目 | Value |
---|---|
wait | wait(long timeout),sleep(long),join(long),LockSupport.parkNanos() 当前线程等待其他线程执行某些操作, |
blocked | synchronized 线程在等待对象的monitor锁,试图通过synchronized去获取某个锁,但是此时其他线程已经独占了monitor锁,那么当前线程就会进入等待状态 |
进入waiting状态是线程主动的, 而进入blocked状态是被动的. 更进一步的说, 进入blocked状态是在同步(synchronized代码之外), 而进入waiting状态是在同步代码之内.
Caution: 当线程进入到synchronized方法或者synchronized代码块时,线程切换到的是BLOCKED状态,而使用java.util.concurrent.locks下lock进行加锁的时候线程切换的是WAITING或者TIMED_WAITING状态,因为lock会调用LockSupport的方法
- 一些方法
interrupt join - sleep()和wait方法辨析
(1)sleep()方法是Thread的静态方法,而wait是Object实例方法
(2)wait()方法必须要在同步方法或者同步块中调用,也就是必须已经获得对象锁。而sleep()方法没有这个限制可以在任何地方种使用。
(3)wait()方法会释放占有的对象锁,使得该线程进入等待池中,等待下一次获取资源。而sleep()方法只是会让出CPU并不会释放掉对象锁;
(4)sleep()方法在休眠时间达到后如果再次获得CPU时间片就会继续执行,而wait()方法必须等待Object.notift/Object.notifyAll通知后,才会离开等待池,并且再次获得CPU时间片才会继续执行。 - sleep和yield方法
sleep()和yield()方法,同样都是当前线程会交出处理器资源,而它们不同的是,sleep()交出来的时间片其他线程都可以去竞争,也就是说都有机会获得当前线程让出的时间片。而yield()方法只允许与当前线程具有相同优先级的线程能够获得释放出来的CPU时间片。 - 什么是守护线程
当前只有守护线程的时候,他就会执行
在后台默默地守护一些系统服务
守护线程在退出的时候并不会执行finnaly块中的代码,所以将释放资源等操作不要放在finnaly块中执行,这种操作是不安全的
public class DaemonDemo {
public static void main(String[] args) {
Thread daemonThread = new Thread(new Runnable() {
@Override
public void run() {
while (true) {
try {
System.out.println("i am alive");
Thread.sleep(500);
} catch (InterruptedException e) {
e.printStackTrace();
} finally {
System.out.println("finally block");
}
}
}
});
daemonThread.setDaemon(true);
daemonThread.start();
//确保main线程结束前能给daemonThread能够分到时间片
try {
Thread.sleep(800);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
i am alive finally block i am alive