Java并发面试题
Java并发面试题
并发基础
并发和并行有什么区别?
- 并行:多个处理器或多核处理器同时处理多个任务。
- 并发:多个任务在同一个 CPU 核上,按细分的时间片轮流(交替)执行,从逻辑上来看那些任务是同时执行
什么是线程,它与进程有什么区别?
一个程序下至少有一个进程,一个进程下至少有一个线程,一个进程下也可以有多个线程来增加程序的执行速度。
线程实例
线程的属性?
线程的属性有:
- id和名字;
- 线程优先级;
- 线程状态;
- 是否为daemon线程。
线程的创建方式?
- 继承Thread类
//step 1:通过继承 Thread类创建NewThread 线程
public class NewThread extends Thread{
public void run(){
System.out.println("create a thread by extends Thread");
}
}
//step 2:实例化一个NewThread线程对象
NewThread newThread=new NewThread();
//step 3:调用start 方法启动NewThread 线程
newThread.start();
- 实现Runnable接口
//step 1:通过实现Runnable接口的方式创建 ChildrenClassThread线程
public class ChildrenClassThread extends SuperClass implements Runnable{
public void run(){
System.out.printIn("create a thread by implements Runnable");
}
}
//step 2:实例化一个 ChildrenClassThread对象
ChildrenClassThread childrenThread= new ChildrenClassThread();
//step 3:创建一个线程对象并将其传入已经实例化好的childrenThread 实例
Thread thread = new Thread(childrenThread);
//step4:调用start方法启动一个线程
thread.start ();
终止线程的方法有哪些
可以使用stop()方法与suspend()方法来终止线程的执行。
- 当用Thread.stop()来终止线程时,它会释放已经锁定的所有监视资源。如果当前任何一个受这些监视资源保护的对象处于一个不一致的状态,其他线程将会“看”不到这个不一致的状态,这可能会导致程序执行的不确定性,并且这种问题很难被定位。
- 调用suspend()方法容易发生死锁。由于调用suspend()方法不会释放锁,这就会导致一个问题:如果一个suspend挂起一个有锁的线程,那么在锁恢复之前将不会被释放。如果调用suspend()方法,线程将试图获得相同的锁,程序就会发生死锁,例如,线程A已经获取到了互斥资源M的锁,此时线程A通过suspend()方法挂起线程A的执行,接着线程B也去访问互斥资源M,这时就会造成死锁。
sleep方法与wait方法的区别?
- sleep方法属于Thread类,wait方法则属于Object类。
- sleep方法暂停执行指定的时间,让出CPU 给其他线程,但其监控状态依然保持,在指定的时间过后又会自动恢复运行状态。
- 在调用sleep方法的过程中,线程不会释放对象锁。
- 在调用wait方法时,线程会放弃对象锁,进入等待此对象的等待锁池,只有针对此对象调用notify方法后,该线程才能进入对象锁池准备获取对象锁,并进入运行状态。
start方法与run方法的区别?
- start方法用于启动线程,真正实现了多线程运行。在调用了线程的start方法后,线程会在后台执行,无须等待run方法体的代码执行完毕,就可以继续执行下面的代码。 在通过调用Thread类的start方法启动一个线程时,此线程处于就绪状态, 并没有运行。
- run方法也叫作线程体,包含了要执行的线程的逻辑代码,在调用run方法后, 线程就进入运行状态,开始运行run方法中的代码。在run方法运行结束后,该线程终止,CPU再调度其他线程。
notify()和notifyAll()有什么区别?
notifyAll()会唤醒所有的线程,notify()只会唤醒一个线程。notifyAll() 调用后,会将全部线程由等待池移到锁池,然后参与锁的竞争,竞争成功则继续执行,如果不成功则留在锁池等待锁被释放后再次参与竞争。而 notify()只会唤醒一个线程,具体唤醒哪一个线程由虚拟机控制。