参考答案
线程是处理器任务调度和执行的基本单位,进程是操作系统资源分配的基本单位。 进程是程序的一次执行过程,是系统运行的基本单位。线程是一个比进程更小的执行单位,一个进程可以包含多个线程。
参考答案
地址空间 | 资源 | 并发性 | 切换 | |
进程 | 进程之间是独立的地址空间 | 进程之间的资源是独立的,能很好的进行资源管理和保护 | 可并发执行 | 进程切换时,消耗的资源大,效率低。 |
线程 | 线程共享本进程的地址空间 | 线程共享本进程的资源如内存、I/O、cpu 等,不利于资源的管理和保护 | 可并发执行 | 线程切换时,消耗的资源小,效率高。 |
参考答案
并发:指应用能够交替执行不同的任务。 并行:指应用能够同时执行不同的任务。 两者区别:并发是交替执行,并行是同时执行。
参考答案
1. 继承 Thread 类 2. 实现 Runnable 接口 3. 实现 Callable 接口
参考答案
守护线程与普通线程的唯一区别是:当 JVM 中所有的线程都是守护线程的时候,JVM 就可以退出了;如果还有一个或以上的非守护线程则不会退出。
参考答案
优点:当一个线程进入等待状态或者阻塞时,CPU 可以先去执行其他线程,提高 CPU 的利用。 缺点: 1. 上下文切换:频繁的上下文切换会影响多线程的执行速度。 2. 不恰当的编程有可能会出现死锁 3. 资源限制:在进行并发编程时,程序的执行速度受限于计算机的硬件或软件资源。在并发编程中,程序执行变快的原因是将程序中串行执行的部分变成并发执行,如果因为资源限制,并发执行的部分仍在串行执行,程序执行将会变得更慢,因为程序并发需要上下文切换和资源调度。
参考答案
1. stop():已废弃。stop 方法存在线程安全问题,会破坏线程的原子性。 2. interrupt(): Interrupt 不会真的中止线程,只是给线程加上了一个标识,即 isInterrupted 从 false 变成了 true;要是线程处于 waiting 状态,再调用 Interrupt 会清除线程的阻塞状态,使线程状态变为 runnable,而且 isInterrupted 也会从 true 变回 false。 3. 使用标志位
参考答案
相同点: 两者都是接口 两者都需要调用 start() 启动线程 不同点: callable 的核心是 ca11() 方法,允许返回值,runnable 的核心是 run() 方法,没有返回值 ca11() 方法可以抛出异常,但是 run() 方法不行
参考答案
线程是通过 Thread 对象所对应的方法 run() 来完成其操作的,而线程的启动是通过 start() 方法执行的。 run() 方法可以重复调用,start() 方法只能调用一次。
参考答案
1. sleep 是线程中的方法,但是 wait 是 Object 中的方法。 2. sleep 方法不会释放 lock,但是 wait 会释放,而且会加入到等待队列中。 3. sleep 方法不依赖于同步器 synchronized,但是 wait 需要依赖 synchronized 关键字。 4. sleep 不需要被唤醒(休眠之后退出阻塞),但是 wait 需要(不指定时间需要被别人中断)。
参考答案
synchronized 有三种方式来加锁,分别是: 1. 修饰实例方法,作用于当前实例加锁,进入同步代码前要获得当前实例的锁 2. 静态方法,作用于当前类对象加锁,进入同步代码前要获得当前类对象的锁 3. 修饰代码块,指定加锁对象,对给定对象加锁,进入同步代码库前要获得给定对象的锁。
参考答案
1. s1eep() 方法会使得当前线程暂停指定的时间,没有消耗 CPU 时间片。 2. sleep()使得线程进入到阻塞状态,yield() 只是对 CPU 进行提示,如果 CPU 没有忽略这个提 示,会使得线程上下文的切换,进入到就绪状态。 3. sleep() 一定会完成给定的休眠时间,yield() 不一定能完成。 4. sleep() 需要抛出 InterruptedException,而 yield() 方法无需抛出异常。