多线程有几种实现方案,每种都有几种?
三种。
继承Thread类
Runnable接口实现: Java不支持类的多重继承,但可以调用多个接口。 所以如果要继承其他类,当然最好调用Runnable接口。
线程和进程有什么区别?
线程是进程的子集,一个进程可以有许多线程,每个线程并行执行不同的任务。
不同的进程使用不同的内存空间,所有线程共享相同的内存空间。 请不要与堆栈内存混淆。 每个线程都有各自的堆栈内存,用于存储本地数据
什么是线程池? 你为什么要用那个?
创建线程需要昂贵的资源和时间,并且只有在任务到来时才创建线程会增加响应时间,从而限制了单个进程可以创建的线程数。 为了避免这些问题,请创建几个线程来在程序启动时响应处理。 这些称为线程池,内部线程称为工作线程。 从JDK1.5开始,Java API提供了一个执行程序框架,允许创建不同的线程池。 例如,单线程池,每次处理一个任务; 固定数量的线程池或高速缓存线程池。 适用于许多生存期较短的任务的程序可扩展线程池。
同步有几种方法,分别是什么?
两种。
同步代码块:
同步代码块
同步方法:
同步方法
是run (还是start )启动线程? 它们有什么区别?
线程启动用start (;
run ) ) :封装线程执行的代码,直接调用只是常规方法的调用
start(3360启动线程,JVM自动调用run )方法
注:将调用start (方法,在start ) (内部为run ) )方法来启动新创建的线程。 这与直接调用方法的效果不同。 文静的宝物是run ) )方法时,只在原始线程中调用,而不启动新线程(start ) ) )方法不会启动新线程。
sleep (和wait )方法有什么区别?
sleep ) ) :必须指向时间; 不解除锁定。
wit ) ) :可以不指定时间,也可以指定时间; 解除锁定。
比较差异
为什么在Object类中定义了wait ()、notify ()和notifyAll () )等方法?
因为对这些方法的调用依赖于锁定对象,而同步代码块的锁定对象是任何锁定。
Object代码是任意对象,因此在此定义。
线程的生命周期?
新建(new ) :处于这种状态的时间很短。 已分配必需的系统资源并执行了初始化。 表示有资格取得CPU时间。 调度程序可以将此线程置于runnable或blocked状态
就绪(Runnable )在此状态下,调度器只要为线程分配时间片,线程就可以运行。 处于这种状态是指能否执行的状态
块(Bolocked ) :线程可以执行,但具有阻止执行的条件。 如果线程被阻止,调度程序将忽略线程,并且不会为线程(如sleep )分配CPU时间。 只有在返回到就绪状态时,才能执行操作。
死亡(Dead )死亡状态线程是不可调度的,不会占用CPU时间。 任务死亡的通常方式是从run ()方法返回。
一个任务处于阻止状态可能是因为以下原因:
1.sleep
2.wait (是线程为notify ) )或notifyAll ) ) )消息,线程进入就绪状态。
3 .任务正在等待某个输入输出完成
4 .线程试图在一个对象上调用同步控制方法,但对象锁不可用,因为另一个任务已经获得此锁。
线程生命周期图
如何避免死锁?
JVA多线程中的死锁
死锁是指两个或多个进程在运行时互相争夺资源而导致的相互等待的现象,如果没有外力的作用,它们就无法前进。 这是一个严重的问题。 由于死锁导致程序锁定,无法完成任务,因此死锁的发生必须满足以下四个条件:
发生死锁的四个条件
避免死锁最简单的方法是阻止循环等待条件,对系统中的所有资源进行标记、排名,并规定所有进程都必须按请求资源的顺序(升序或降序)操作以避免死锁