vol.2 线程状态转换以及基本操作

  1. 如何新建一个线程?
    (1)通过继承Thread类,重写run方法;
    (2)通过实现runable接口,重写run方法,然后作为target对象加入Thread;
    (3)通过实现callable接口,重写call()方法,使用Future对象进行封装,然后将Future对象加入到Thread中
  2. 继承Thread和runnable接口有什么区别
    继承 Thread 类:我们创建了三次 MyThread 对象,也就是创建了三个任务(工作四个小时这个任务)和三个线程(张三,李四和赵五三个人),每个线程去完成自己的任务;即多个线程分别完成自己的任务
    实现 Runnable 接口:我们创建了一个 MyRunnabld 对象(工作八个小时这个任务)和三个线程(张三,李四和赵五三个人);让这三个线程去共同完成一个任务;即多个线程共同完成一个任务
  3. 线程状态是怎样转换的?
    在这里插入图片描述
  4. 阻塞和等待的区别
    阻塞是没有获取锁,等待是已经获取锁了,还要获取其他的资源
项目Value
waitwait(long timeout),sleep(long),join(long),LockSupport.parkNanos() 当前线程等待其他线程执行某些操作,
blockedsynchronized 线程在等待对象的monitor锁,试图通过synchronized去获取某个锁,但是此时其他线程已经独占了monitor锁,那么当前线程就会进入等待状态

进入waiting状态是线程主动的, 而进入blocked状态是被动的. 更进一步的说, 进入blocked状态是在同步(synchronized代码之外), 而进入waiting状态是在同步代码之内.
Caution: 当线程进入到synchronized方法或者synchronized代码块时,线程切换到的是BLOCKED状态,而使用java.util.concurrent.locks下lock进行加锁的时候线程切换的是WAITING或者TIMED_WAITING状态,因为lock会调用LockSupport的方法
在这里插入图片描述

  1. 一些方法
    interrupt join
  2. sleep()和wait方法辨析
    (1)sleep()方法是Thread的静态方法,而wait是Object实例方法
    (2)wait()方法必须要在同步方法或者同步块中调用,也就是必须已经获得对象锁。而sleep()方法没有这个限制可以在任何地方种使用。
    (3)wait()方法会释放占有的对象锁,使得该线程进入等待池中,等待下一次获取资源。而sleep()方法只是会让出CPU并不会释放掉对象锁;
    (4)sleep()方法在休眠时间达到后如果再次获得CPU时间片就会继续执行,而wait()方法必须等待Object.notift/Object.notifyAll通知后,才会离开等待池,并且再次获得CPU时间片才会继续执行。
  3. sleep和yield方法
    sleep()和yield()方法,同样都是当前线程会交出处理器资源,而它们不同的是,sleep()交出来的时间片其他线程都可以去竞争,也就是说都有机会获得当前线程让出的时间片。而yield()方法只允许与当前线程具有相同优先级的线程能够获得释放出来的CPU时间片。
  4. 什么是守护线程
    当前只有守护线程的时候,他就会执行
    在后台默默地守护一些系统服务
    守护线程在退出的时候并不会执行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
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值