云计算百科
云计算领域专业知识百科平台

八股日记Day03

1.创建线程的方法有哪些?

继承Thread类

优点:继承Thread操作简单,用Thread.currentThread()可以得到当前运行的线程,用this也可以直接得到当前运行的线程

缺点:继承Thread类后不能继承其他类

实现Runnable接口

若是一个方法继承了其他父类,就可以实现java.lang.Runnable接口,实现接口需要重写它的Run方法,然后在Thread构造器里把Runnable对象作为参数传递进去,然后使用strat()方法创建线程

优点:可以在继承其他父类时,创建线程,并且可以实现多个线程资源共享,可以操作同一个Runnable对象,可以把cpu代码和数据分开,更好体现面向对象的编程思想

缺点:操作比较复杂,访问当前线程只能用Tread.currentTread()方法

实现Callable接口与FutureTask

java.util.concurrent.Callable接口类似于Runnable接口,但Callabe接口的call方法有返回值还可以抛出异常,想要创建线程需要先创建Callable对象,然后把对象作为参数传给Future Task任务管理器,然后创建线程,执行Callable任务、还可以得到任务结果

优点:可以继承其他父类,并且实现资源共享

缺点:操作复杂并且访问当前线程只能Thread.currentThead()

使用线程池

Java 5 引入的java.util.concurrent.ExecutorService接口和其他类,提供了线程池的支持,避免了查询和创建线程,可以通过Executor的静态方法创建不同类型的线程池、提高了线程管理效率

优点:可以避免重用预先创建的线程,避免了创建和查询线程的开销,提高了线程管理的效率。线程池可以合理的分配线程,避免资源浪费,如果遇到并发情况,线程池还可以快速提供线程来处理任务,减少等待时间。合理设置线程池的大小,可以提高cpu的利用率和系统吞吐量

补:系统吞吐量是指单位时间内系统成功处理的任务或业务量

缺点:代码操作比较复杂,在设置线程池参数的时候如果出错,可能会引起死锁,资源进程等问题,修复起来比较复杂

2.怎么启动线程?

通过Thread类的strat方法

3.怎么停止线程?

异常停止:用线程的interrupt()方法来判断当前对象的interrupted()状态,如果是中断状态那么就抛出异常,实现中断线程

睡眠停止:让先线程睡眠(进入可中断阻塞状态),然后调用中断(interrupt方法),标记中断状态,即让中断状态为ture,此时线程会醒来中断阻塞状态,并抛出异常,引起停止线程

stop()暴力停止:已经被废弃,线程如果强行调用stop()暴力停止可能会引起清理性的工作无法完成

使用return停止:单纯只写一个 return并不能直接让线程退出;而是要先通过 “调用 interrupt()把线程的中断标记设为中断状态”,然后 run()方法本身检查这个中断标记是否被置位,如果已经被置位(也就是处于“中断状态”),再执行 return来结束 run()方法,进而让线程退出。

补:

中断

是一个动作也就是调用Thread.interrupt()方法,改方法会发送一个中断请求,这是一个信号,不是强制立刻停止线程。

中断标记(中断状态)​

这是线程对象内部的一个布尔标志位(true/false):

  • true表示该线程收到了中断请求(但未必已处理)。

  • false表示没有收到中断请求或已被清除。

这个标志位是持久化存储在线程对象里的,直到被显式改变。

赞(0)
未经允许不得转载:网硕互联帮助中心 » 八股日记Day03
分享到: 更多 (0)

评论 抢沙发

评论前必须登录!