Java初级工程师面试题精选3
说明:本面试题大多都是根据《Java面试问题集》、《Java程序员面试宝典》、《程序员面试宝典》等书籍概括精选而来,其中也补充了一些自己在工作的过程中遇到的面试题,虽然不能遍及Java的所有知识点,但绝对都是面试会问到的高频知识点。
61.Java中有几种方法可以实现一个线程?用什么关键字修饰同步方法?stop()和suspend()方法为何不推荐使用?
Java中有三种方法来实现一个线程,分别是继承Thread类、实现Runnable接口、使用ExecutorService,Callable,Future。其中,前两种线程执行完之后没有返回值,最后一种是带返回值的。
继承Thread:自己的线程类继承Thread,然后创建一个自己线程类的实例,通过实例调用start方法来执行run方法。
Public class MyThread extends Thread {
Public void run() {
...
}
}
1
2
3
4
5
1
2
3
4
5
然后在合适的地方启动线程:
MyThread t1 = new MyThread();
MyThread t2 = new MyThread();
t1.start();
t2.start();
1
2
3
4
1
2
3
4
实现Runnable接口:自己的线程类实现Runnable接口,然后创建一个自己线程类的实例,将实例作为参数构造一个Thread对象,最后通过该Thread对象来调用start方法运行run方法。
Public class MyThread extends Otherclass implements Runnable{
Public void run() {
...
}
}
1
2
3
4
5
1
2
3
4
5
然后在合适的地方启动线程:
MyThread t1 = new MyThread();
Thread thread = new Thread(t1);
Thread.start();
1
2
3
1
2
3
使用ExecutorService,Callable,Future来实现:可返回值的任务必须实现Callable接口,类似的,无返回值的任务必须Runnable接口。执行Callable任务后,可以获取一个Future的对象,在该对象上调用get就可以获取到Callable任务返回的Object了,再结合线程池接口ExecutorService就可以实现传说中有返回结果的多线程了。
参考:blog.csdn/aboy123/article/details/38307539
java面试题及答案2020用synchronized关键字来修饰同步方法,表示该方法只能同时被一个线程访问。
stop方法不安全,suspend方法容易发生死锁。
62.sleep()和join()和yield()和wait()之间的区别
首先说下sleep()和yield()的区别:
1)sleep()必须带参数,yield()不带参数。
2)sleep()是让当前线程进入sleep状态,时间到了,然后进入就绪态;yield()是直接让当前线程进入就绪态。
3)sleep()后,所有优先级的其它线程都有机会运行;yield()后,只有相同优先级的线程才有机会执行。
Tips:sleep()和yield()都不会释放对象锁。
join()方法是让调用该方法的Thread在完成了run中的代码之后才能执行join后面的代码。比如:
thread1.start();
thread2.start();
1
2
1
2
这样的话,thread1和thread2会同时运行,但是这样:
thread1.start();
thread1.join();
thread2.start();
1
2
3
1
2
3
那么只有当线程thread1完成执行之后才能执行thread2。所以通过join方法可以确保多个线程按照顺序执行。