Java面试之线程

Java面试之线程Java面试之线程

大家好,又见面了,我是你们的朋友全栈君。

1、sleep() 和wait() 有什么区别? 【基础】

答:sleep 是线程类(Thread)的方法,导致此线程暂停执行指定时间,给执行机会给其他线程,但是监控状态依然保持,到时后会自动恢复。调用sleep 不会释放对象锁。wait 是Object 类的方法,对此对象调用wait 方法导致本线程放弃对象锁,进入等待此对象的等待锁定池,只有针对此对象发出notify 方法(或notifyAll)后本线程才进入对象锁定池准备获得对象锁进入运行状态。

2、当一个线程进入一个对象的一个synchronized 方法后,其它线程是否可进入此对象的其它方法? 【基础】

答:其它线程只能访问该对象的其它非同步方法,同步方法则不能进入。

3、请说出你所知道的线程同步的方法。【基础】

答:wait():使一个线程处于等待状态,并且释放所持有的对象的lock;sleep():使一个正在运行的线程处于睡眠状态,是一个静态方法,调用此方法要捕捉InterruptedException 异常;notify():唤醒一个处于等待状态的线程,注意的是在调用此方法的时候,并不能确切的唤醒某一个等待状态的线程,而是由JVM 确定唤醒哪个线程,而且不是按优先级;
notityAll():唤醒所有处入等待状态的线程,注意并不是给所有唤醒线程一个对象的锁,而是让它们竞争。

4、多线程有几种实现方法,都是什么?同步有几种实现方法,都是什么? 【基础】

答:多线程有两种实现方法,分别是继承Thread 类与实现Runnable 接口,同步的实现方面有两种,分别是synchronized,wait 与notify。

5、同步和异步有何异同,在什么情况下分别使用他们?举例说明。【基础】

答:如果数据将在线程间共享。例如正在写的数据以后可能被另一个线程读到,或者正在读的数据可能已经被另一个线程写过了,那么这些数据就是共享数据,必须进行同步存取。当应用程序在对象上调用了一个需要花费很长时间来执行的方法,并且不希望让程序等待方法的返回时,就应该使用异步编程,在很多情况下采用异步途径往往更有效率。

6、启动一个线程是用run()还是start()?【基础】

答:启动一个线程是调用start()方法,使线程所代表的虚拟处理机处于可运行状态,这意味着它可以由JVM 调度并执行。这并不意味着线程就会立即运行。run()方法可以产生必须退出的标志来停止一个线程。

7、线程的基本概念、线程的基本状态以及状态之间的关系?【基础】

答:线程指在程序执行过程中,能够执行程序代码的一个执行单位,每个程序至少都有一个线程,也就是程序本身;Java 中的线程有四种状态分别是:运行、就绪、挂起、结束。

8、简述synchronized 和java.util.concurrent.locks.Lock 的异同?【中等难度】

答:主要相同点:Lock 能完成synchronized 所实现的所有功能;主要不同点:Lock 有比synchronized 更精确的线程语义和更好的性能。synchronized 会自动释放锁,而Lock 一定要求程序员手工释放,并且必须在finally 从句中释放。

9、java 中有几种方法可以实现一个线程?用什么关键字修饰同步方法?stop()和suspend()方法为何不推荐使用?【中等难度】

答:有两种实现方法,分别是继承Thread 类与实现Runnable 接口;用synchronized 关键字修饰同步方法;反对使用stop(),是因为它不安全。它会解除由线程获取的所有锁定,而且如果对象处于一种不连贯状态,那么其他线程能在那种状态下检查和修改它们。结果很难检查出真正的问题所在;suspend()方法容易发生死锁。调用suspend()的时候,目标线程会停下来,但却仍然持有在这之前获得的锁定。此时,其他任何线程都不能访问锁定的资源,除非被“挂起”的线程恢复运行。对任何线程来说,如果它们想恢复目标线程,同时又试图使用任何一个锁定的资源,就会造成死锁。故不应该使用suspend(),而应在自己的Thread 类中置入一个标志,指出线程应该活动还是挂起。若标志指出线程应该挂起,便用wait()命其进入等待状态。若标志指出线程应当恢复,则用一个notify()重新启动线程。

10、设计4 个线程,其中两个线程每次对j 增加1,另两个线程对j 每次减少1;写出程序。【中等难度】

答:以下程序使用内部类实现线程,对j 增减的时候没有考虑顺序问题:

public class TestThread {
private int j;
public TestThread(int j) {this.j = j;}
private synchronized void inc(){
j++;
System.out.println(j + "--Inc--" +
Thread.currentThread().getName());
}
private synchronized void dec(){
j--;
System.out.println(j + "--Dec--" +
Thread.currentThread().getName());
}
public void run() {
(new Dec()).start();
new Thread(new Inc()).start();
(new Dec()).start();
new Thread(new Inc()).start();
}
class Dec extends Thread {
public void run() {
for(int i=0; i<100; i++){
dec();
}
}
}
class Inc implements Runnable {
public void run() {
for(int i=0; i<100; i++){

inc();
}
}
}
public static void main(String[] args) {
(new TestThread(5)).run();
}
}
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/106562.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • 《Python爬虫大数据采集与挖掘》期末考试考题汇总带答案

    《Python爬虫大数据采集与挖掘》期末考试考题汇总带答案一、填空题1、爬虫技术的应用可以分为两大类:采集型爬虫、监测型爬虫。2、根据Web页面组成结构中的信息内容的生成方式不同,可以将Web页面分为静态页面、动态页面、以及伪静态页面三大类。3、Robots协议为了给Web网站提供灵活的控制方式来决定页面是否能够被爬虫采集。4、在浏览器中打开网站后,在网站首页的地址后面添加“/robots.txt”,如果网站设置了访问许可,按回车就可以看到网站的robots协议,即robots.txt文件内容。5、Web信..

    2022年6月16日
    40
  • C PictureBox 图片控件

    C PictureBox 图片控件图片控件中常用的属性如下表所示 图片控件中图片的设置除了可以直接使用 ImageLocatio 属性指定图片路径以外 还可以通过 Image FromFile 方法来设置 实现的代码如下 图片控件的名称 Image Image FromFile 图像的路径 实例 实现图片交换 Form1

    2025年7月7日
    1
  • python函数–isalpha()方法[通俗易懂]

    python函数–isalpha()方法[通俗易懂]isalpha()方法描述:Pythonisalpha()方法检测字符串是否只由字母组成。isalpha()方法语法:str.isalpha()参数:无。返回值:如果字符串至少有一个字符并且所有

    2022年7月5日
    26
  • ffplay 命令_ffprobe命令

    ffplay 命令_ffprobe命令一、主要选项说明:-xwidth   强制显示宽带。-yheight   强制显示高度。-ssize   帧尺寸设置显示帧存储(WxH格式),仅适用于类似原始YUV等没有包含帧大小(WxH)的视频。该参数已经被废弃,请尝试用-video_size代替-fs   以全屏模式启动。-an   禁用音频(不播放声音)-vn   禁用视频(不播放视频)-sn   禁…

    2025年7月24日
    3
  • jdk动态代理和cglib动态代理详解

    jdk动态代理和cglib动态代理详解本文内容概括:静态代理概述 基于继承方式实现静态代理 基于聚合方式实现静态代理 jdk动态代理实现 如何实现一个HashMap的动态代理类 cglib动态代理实现 jdk和cglib代理的区别 动态代理和静态代理的区别 spring如何选择jdk和cglib代理如上图,代理模式可分为动态代理和静态代理,我们比较常用的有动态代理中的jdk动态代理和Cglib代理,像spr…

    2022年5月16日
    37
  • mysql 8.0 修改密码_一键清除锁屏密码

    mysql 8.0 修改密码_一键清除锁屏密码因为装的时间久了,密码不记得了,又不想重新装,怎么办呢?在程序管理器中将mysql服务停止,也就是直接停止mysqld。用mysql–shared-memory–skip-grant-tables启动mysql,但是这里发生错误:原因是没有设置数据路径,这里加上数据路径,并回车,启动mysqld。另启动一个cmd,执行mysql命令,启动客户端,输入FLUSHPRIVILEG…

    2022年10月15日
    1

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号