wordpress指定404,网站优化建设南昌,wordpress找回密码链接,厦门百度整站优化服务一、创建线程的几种方式#xff1f;
① 通过继承Thread类并重写run方法
#xff0c;实现简单但不可以继承其他类
Thread底层也是实现了Runnable接口#xff0c;重写的是run而不是start方法
②实现Runnable接口并重写run方法#xff0c;
避免了单继承的局限性#xff…一、创建线程的几种方式
① 通过继承Thread类并重写run方法
实现简单但不可以继承其他类
Thread底层也是实现了Runnable接口重写的是run而不是start方法
②实现Runnable接口并重写run方法
避免了单继承的局限性实现解耦更灵活 可以通过匿名内部类Runnable接口是一个函数式接口可以用Lambda表达式
③实现Callable接口【泛型类型为重写call方法的返回值类型】并重写call方法
可以获取线程的执行结果的返回值
FutureTask底层也是继承了Runnable接口使用Thread结合FutureTask这种方式可以拿到异步执行任务的结果。
④【项目中常使用的方式】通过线程池创建
ExecutorService es new Executors.newSingleThreadExecutor();
然后es.submit配合①或者②
但是一般都是使用自定义创建线程池。
二、Runnable接口和Callable接口的区别
Runnable接口run方法无返回值Callable接口call方法有返回值支持泛型。
Runnable接口run方法不允许抛出异常只能在内部trycatch消化而Callable的call方法允许抛出异常。
不能抛异常是因为简化线程的异常处理 避免线程阻塞 提高代码的健壮性 保持接口的简洁性 提高线程池的稳定性和效率
三、在启动线程的时候可以使用run方法吗run和start有什么区别
start方法用来启动线程通过该线程调用run方法执行run方法中定义的逻辑。start方法只能被调用一次。
run方法封装了要被线程执行代码可以被调用多次如果直接调用run方法则就是一个普通的方法【通过主线程调用的】而想通过新线程去调用run方法则需要通过start去调用。
四、线程的几种状态以及线程之间的切换
Thread类中的枚举State 当线程对象被创建的时候为新建状态
当线程对象调用了start方法则进入就绪
当抢到CPU则直接进入运行且就绪和运行都属于可运行状态
当线程对象无法获得锁则进入阻塞状态获得到了锁则切换为可运行状态
当线程对象调用了wait方法则进入等待状态通过notify方法唤醒则切换为可运行状态
【可能存在锁竞争如果是notifyAll方法也可能存在锁竞争因为可能有很多个线程同时被唤醒】
当线程对象调用sleep方法进入计时等待状态当休眠时间结束则切换为可运行状态
当线程对象执行完则进入死亡TERMINATED状态
五、notify和notifyAll区别
notify只随机唤醒一个wait线程【是否随机取决于虚拟机版本HotSpot貌似是顺序执行】
notifyAll唤醒所有wait的线程
六、wait和sleep的区别
相同点 wait(long)、wait()、sleep(long)三者都是将当前线程暂时放弃cpu的使用权进入等待状态 wait(long)和sleep(long)都是在一定时间之后重新被唤醒【时间到了就从等待状态变为可运行状态只要cpu分配到了就可以继续执行】而wait()如果不主动唤醒则一直等待下去
不同点 wait方法为Object对象的每个对象都有而sleep为Thread类的静态方法
重点 都能让当前线程暂时放弃cpu的使用权进入阻塞状态
七、新建T1、T2、T3三个线程如何保证它们按顺序执行
使用线程中的join方法join
调用join方法所在的线程将进入计时等待状态直到调用join方法的线程执行完
相当于让这两个线程之间有同步关系 八、怎么结束正在进行的线程
第一种是已经不推荐使用的stop方法
第二种是通过interrupt方法中断线程【推荐的】
如果打断阻塞的线程sleepwaitjoin则会抛出InterruptedException异常。
打断正常的线程可以根据打断状态来标记是否退出线程
下面代码中通过if判断interrupted是否为true【默认为false】为true则直接终止(死)循环,这样线程就终止了