《2022年二线程JAVA面试题[借 .pdf》由会员分享,可在线阅读,更多相关《2022年二线程JAVA面试题[借 .pdf(4页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。
1、18二、 JAVA 线程基础知识1、线程的基本概念、线程的基本状态以及状态之间的关系?线程: 有时称轻量级进程。进程中的一个运行实体,是一个 CPU 调度单位,资源的拥有者还是进程或称任务。事实上, 引入线程主要是为了提高系统的执行效率,减少处理机的空转时间和调度切换(保护现场信息) 的时间,以及便于系统管理。Java 中的线程有四种状态分别是:运行(执行 )、就绪、阻塞 (挂起 )、结束。2、什么叫死锁 ?当被锁定的A 对象试图访问另一个被锁定的B 对象, B 对象同时又要访问已被锁定的A 对象。这样导致两个线程都在等待另一个线程释放资源,这样就出现了死锁。3、启动一个线程是用run()还是
2、 start()?启动一个线程是调用start()方法,使线程所代表的虚拟处理机处于可运行状态,这意味着它可以由JVM 调度并执行, 但并不意味着线程就会立即运行。run()方法可以产生必须退出的标志来停止一个线程。用于完成一个线程“实际功能”的代码放在run()方法中。 Run()方法可以在Thread 的子类中重写,也可以在Runable 对象中重写4、sleep() 和 wait() 有什么区别 ? 搞线程的最爱(1).sleep 是线程类( Thread)的方法,导致此线程在指定时间内暂停执行,让执行机会给与其他线程,但是监控状态依然保持, 到时后会自动恢复。在 sleep 时间间隔期
3、满后,线程不一定立即恢复执行。这是因为在那个时刻,其它线程可能正在运行而且没有被调度为放弃执行,除非:(a)“醒来”的线程具有更高的优先级(b)正在运行的线程因为其它原因而阻塞,调用sleep 不会释放对象锁。wait 是 Object 类的方法,对此对象调用wait 方法导致本线程放弃对象锁,进入等待此对象的等待锁定池,只有针对此对象发出notify 方法(或 notifyAll )后本线程才进入对象锁定池准备获得对象锁进入运行状态。(2).sleep(milliseconds) 可以用时间指定来使他自动醒过来,如果时间不到你只能调用interreput() 来强行打断; wait()可以用
4、 notify() 直接唤醒。(3).synchronized 锁定机制可以避免线程间的相互影响,但是我们还需要一种能在线程间进行通信的方法。为达此目地,wait 方法允许线程等待, 直到某条件成立,通知方法 (notificationmethod)notify和 notifyAll唤醒线程;且 sleep()不释放同步锁,wait()释放同步锁。5、当一个线程进入一个对象的一个synchronized 方法后,其它线程是否可进入此对象的其它方法?不能,一个对象的一个synchronized 方法只能由一个线程访问。情况一: 当一个线程进入一个对象的一个synchronized 方法后,其它线
5、程访问该对象的非同步方法。运行结果:一个线程在访问一个对象的同步方法时,另一个线程可以同时访问这个对象的非同步方法。情况二: 当一个线程进入一个对象的一个synchronized 方法后,其它线程也访问该同步方法。运行结果:一个线程在访问一个对象的同步方法时,另一个线程不能同时访问这个同步方法。情况三: 当一个线程进入一个对象的一个synchronized 方法后,其它线程同时访问该对象的另一个同步方法。运行结果:一个线程在访问一个对象的同步方法时,另一个线程不能同时访问这个对象的另一个同步方法。6、多线程有几种实现方法,都是什么?同步有几种实现方法,都是什么 ? stop()和 suspen
6、d()方法为何不推荐使用?答: 多线程: (1).继承 Thread 类(2).实现 Runnable 接口再new Thread(YourRunnableOjbect)推荐线程同步: (1).用 synchronized 修饰需要同步的方法public void synchronized add(). (2).用 synchronized 块包围需要同步的语句synchronized (需要同步的对象). (3). JDK1.5 中使用java.util.concurrent包中的各种同步锁线程同步方法中还可以使用如下四种特定的方法对线程进行调度:wait(): 使一个线程处于等待状态,并且
7、释放所持有的对象的lock。sleep():使一个正在运行的线程处于睡眠状态,是一个静态方法,调用此方法要捕捉InterruptedException 异常。notify(): 唤醒一个处于等待状态的线程,注意的是在调用此方法的时候,并不能确切的唤醒某一个等待状态的线程,而是由JVM 确定唤醒哪个线程,而且不是按优先级。Allnotity(): 唤醒所有处入等待状态的线程,注意并不是给所有唤醒线程一个对象的锁,而是让它们竞争。名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 1 页,共
8、 4 页 - - - - - - - - - 19反对使用stop(),是因为它不安全。它会解除由线程获取的所有锁定,而且如果对象处于一种不连贯状态,那么其他线程能在那种状态下检查和修改它们。结果很难检查出真正的问题所在。suspend()方法容易发生死锁。调用suspend()的时候,目标线程会停下来,但却仍然持有在这之前获得的锁定。此时,其他任何线程都不能访问锁定的资源,除非被挂起 的线程恢复运行。对任何线程来说,如果它们想恢复目标线程,同时又试图使用任何一个锁定的资源,就会造成死锁。所以不应该使用suspend(),而应在自己的Thread 类中置入一个标志,指出线程应该活动还是挂起。若
9、标志指出线程应该挂起,便用wait() 命其进入等待状态。若标志指出线程应当恢复,则用一个 notify() 重新启动线程。7、简述 synchronized 和 java.util.concurrent.locks.Lock的异同 ?主要相同点:Lock 能完成 synchronized 所实现的所有功能主要不同点:Lock 有比 synchronized 更精确的线程语义和更好的性能。synchronized 会自动释放锁,而Lock 一定要求程序员手工释放,并且必须在finally 从句中释放。8、同步和异步的区别?同步:指一个进程 /线程执行一个操作后,等待另一个进程/线程的动作后再继
10、续,如同两个进程按一定规则,你等等我我等等你一起走;异步:指一个进程作了一个操作后,不用等待另一进程的结果就继续向下进行,两个进程的事件上没有同部的关系。所以 socket 同步传送,程序返回就知道传完了,异步送和收的动作可能相差很久,需要队列、缓冲区等方式先将数据保留。Socket 编程中,采用同步控制方法,优点:结构清晰,编程简单,执行一个通讯过程相当于执行一个函数调用,简单易用。通常采用有限等待方式。即:发送一个数据后,一直等待对方回应,直到超时为止。缺点:在这断时间里,该线程处于阻塞状态,界面失去响应。采用异步控制方法,优点:程序效率很高。缺点:结构不清晰,编程相对复杂,一般需要自已处
11、理发送队列,收到回应后,需要查询发送队列,将处理结果通知发送者(可以采用回调函数方式)。I.(1).如果数据将在线程间共享。例如正在写的数据以后可能被另一个线程读到,或者正在读的数据可能已经被另一个线程写过了,那么这些数据就是共享数据,必须进行同步存取;(2).当应用程序在对象上调用了一个需要花费很长时间来执行的方法,并且不希望让程序等待方法的返回时,就应该使用异步编程,在很多情况下采用异步途径往往更有效率。II.(1).同步可防止并发,主要出于数据安全的考虑(同步是为了保证数据的读写安全,当用户并发操作时对数据进行保护,防止错误的读写数据);如:某一线程在执行完对数据的加法操作后,在还没来得
12、及使用新数据之前,被另一线程就抢先执行了减法操作,这样它就没法得到另一线程单一施加影响的数据结果,存在安全隐患,所以需要引入同步处理。(2).异步允许并发(异步就是互不影响);如: ajax 的第一个a 就是异步 Asynchronous,你一边浏览网页,后台一边和web 服务器通信检查你的用户名是否重复,但你却在前台根本看不出来;ajax 技术通常都是异步实现的,去服务端请求数据的同时,前台的操作不会阻塞,而是异步进行,节省时间的同时保证了效率。III.在客户端发出一个方法调用后,客户端将被阻塞,直至调用返回为止,这种方式被称为同步处理。也就是说,在客户端等待期间它不能执行任何代码。若使用异
13、步处理,就可以在等待期间让客户端做其它的事情。多线程可认为是异步的;单线程可认为是同步的!IV.(1).同步消息就是要等待消息处理函数返回后才可以向下运行。同步就是几个函数同时处理,其间时间间隔为1/10秒;(2).异步消息就是发出消息后不等待处理消息的函数返回继续向下运行。例 1:普通 B/S 模式(同步)AJAX 技术(异步)同步:提交请求-等待服务器处理-处理完毕返回这个期间客户端浏览器不能干任何事异步 : 请求通过事件触发-服务器处理(这是浏览器仍然可以作其他事情)-处理完毕例 2:SendMessage(.)名师资料总结 - - -精品资料欢迎下载 - - - - - - - - -
14、 - - - - - - - - - 名师精心整理 - - - - - - - 第 2 页,共 4 页 - - - - - - - - - 20TRACE0(justlikesend);PostMessage(.)TRACE0(justlikeWSASendusingoverlapped);SendMessage是调用的时候不返回,等消息响应后才执行TRACE0, 这就是同步 .PostMessage是调用后马上返回,不用消息响应就执行TRACE0, 这就是异步 .例 3:打电话时同步;发消息是异步例 4:同步就是你在喝完酒后再吃菜;而异步你可以一边吃饭一边看电视。例 5:吃饭和说话,只能一件
15、事一件事的来,因为只有一张嘴。嘴是一个资源,说话和吃饭相当于两个工作线程,只是我们人自己完成了这个同步,你先停止吃饭,然后说话;吃饭和听音乐是异步的,因为,听音乐并不影响我们吃饭。相当于两工作线程,互不相于,你(人)这个对象可以做两个行为,吃和听,所以是异步的。9、Thread 构造函数有几种?Thread()Thread(Runable target)Thread(Runable target,String name)Thread(ThreadGroup group,Runable target)Thread(ThreadGroup group,Runable target,String n
16、ame)Thread(ThreadGroup group,String name)10、创建 3 个显示时间的线程,分别间隔为1 秒、 3 秒、 5 秒。import java.util.Date;public classTimeThread extends Threadprivate boolean quit = false;private String threadName;private int interval = 0;public TimeThread(String threadName,int interval) this.threadName = threadName;this.
17、interval = interval;this.start();public void run() while (!quit) try System.out.println(threadName+new Date().toLocaleString();Thread.sleep(interval * 1000); catch (InterruptedException ex) /Thread safe quit functionpublic void quit()this.quit = true;public static void main(String args)TimeThread ti
18、meThread1 = new TimeThread(Thread1 Interval 1 sec,1);TimeThread timeThread3 = new TimeThread(Thread2 Interval 3 sec,3);TimeThread timeThread5 = new TimeThread(Thread3 Interval 5 sec,5);名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 3 页,共 4 页 - - - - - - - - - 2111、设计
19、 4 个线程,其中两个线程每次对j 增加 1,另外两个线程对j 每次减少1。写出程序。以下程序使用内部类实现线程,对j 增减的时候没有考虑顺序问题。public classThreadTest private int j;public static void main(String args) ThreadTest tt = new ThreadTest();Inc inc = tt.new Inc();Dec dec = tt.new Dec();for (int i = 0; i 2; i+) Thread t = new Thread(inc);t.start();t = new Thr
20、ead(dec);t.start();private synchronized void inc() j+;System.out.println(Thread.currentThread().getName()+ -inc: + j);private synchronized void dec() j-;System.out.println(Thread.currentThread().getName()+ -dec: + j);classInc implements Runnable public void run() for (int i = 0; i 5; i+) inc();classDec implements Runnable public void run() for (int i = 0; i 5; i+) dec();名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 4 页,共 4 页 - - - - - - - - -