15+N个*网上流行的Java多线程面试题及自己总结的答案(遇到即会更新)

时间:2021-01-14 17:30:20

1)现在有T1、T2、T3三个线程,你怎样保证T2在T1执行完后执行,T3在T2执行完后执行?直接上代码(所有程序均以简单明了为主)

原文引用:这个线程问题通常会在第一轮或电话面试阶段被问到,目的是检测你对”join”方法是否熟悉。这个多线程问题比较简单,可以用join方法实现。 

自己总结:

//还不如顺序写程序了,不用线程了,哈哈
public class JoinTest
{


public static void main(String[] args) throws InterruptedException
{
Thread1 T1=new Thread1();
Thread2 T2=new Thread2();
Thread3 T3=new Thread3();
T1.start();

T1.join();
T2.start();
T2.join();
T3.start();
T3.join();


}

}

class Thread1 extends Thread
{

public void run()
{

System.out.println("T1 running");


}

}

class Thread2 extends Thread
{

public void run()
{

System.out.println("T2 running");


}

}

class Thread3 extends Thread
{

public void run()
{

System.out.println("T3 running");

}

}
join()表示无限期等待直到该线程结束,join(millis)表示只等待该线程millis毫秒的时间,关于join()具体的介绍大家可参考这篇文章,介绍的比较好 http://www.blogjava.net/vincent/archive/2008/08/23/223912.html

2)在Java中Lock接口比synchronized块的优势是什么?你需要实现一个高效的缓存,它允许多个用户读,但只允许一个用户写,以此来保持它的完整性,你会怎样去实现它?

原文引用:lock接口在多线程和并发编程中最大的优势是它们为读和写分别提供了锁,它能满足你写像ConcurrentHashMap这样的高性能数据结构和有条件的阻塞。Java线程面试的问题越来越会根据面试者的回答来提问。我强烈建议在你去参加多线程的面试之前认真读一下Locks,因为当前其大量用于构建电子交易终统的客户端缓存和交易连接空间。

 3)什么是原子操作,Java中的原子操作是什么?

cpu在一个时间片内可以完成的操作,我们来看一下度娘百科的说法:

原子操作(atomic operation)是不需要synchronized",这是Java多线程编程的老生常谈了。所谓原子操作是指不会被线程调度机制打断的操作;这种操作一旦开始,就一直运行到结束,中间不会有任何 context switch (切换到另一个线程)

4) 为什么我们调用start()方法时会执行run()方法,为什么我们不能直接调用run()方法?

原文引用:这是另一个非常经典的java多线程面试问题。这也是我刚开始写线程程序时候的困惑。现在这个问题通常在电话面试或者是在初中级Java面试的第一轮被问到。这个问题的回答应该是这样的,当你调用start()方法时你将创建新的线程,并且执行在run()方法里的代码。但是如果你直接调用run()方法,它不会创建新的线程也不会执行调用线程的代码。阅读我之前写的《start与run方法的区别》这篇文章来获得更多信息。

详细解答:之所以出现线程,就是为了更好的利用CPU,让她更加“精明”的干活。 通过调用Thread类的start()方法来启动一个线程, 这时此线程是处于就绪状态, 并没有运行。 然后通过此Thread类调用方法run()来完成其运行操作的, 这里方法run()称为线程体, 它包含了要执行的这个线程的内容, Run方法运行结束, 此线程终止, 而CPU再运行其它线程, 而如果直接用Run方法, 这只是调用一个方法而已, 程序中依然只有主线程--这一个线程, 其程序执行路径还是只有一条, 这样就没有达到写线程的目的。

个人理解:其实自己写一个简单点的程序就知道区别了,在main中如果直接调用run() 那跟正常的程序没什么区别,方法的执行顺序与方法的前后顺序有关~

5)在java中wait和sleep方法的不同?


原文引用:通常会在电话面试中经常被问到的Java线程面试问题。最大的不同是在等待时wait会释放锁,而sleep一直持有锁。Wait通常被用于线程间交互,sleep通常被用于暂停执行。


详细解答:sleep是线程被调用时,占着cpu去睡觉,其他线程不能占用cpu,os认为该线程正在工作,不会让出系统资源,wait是进入等待池等待,让出系统资源,其他线程可以占用cpu