JAVA多线程试题 答案
八股文java多线程面试题

八股文java多线程面试题Java多线程是面试中经常涉及的一个重要主题。
下面我将从不同角度回答一些与Java多线程相关的面试题。
1. 什么是线程?Java中如何创建线程?线程是程序执行的最小单位,它是进程中的一个执行流。
在Java中,有两种创建线程的方式,一种是继承Thread类,另一种是实现Runnable接口。
2. Java中如何实现线程同步?Java提供了多种实现线程同步的机制,最常用的是使用synchronized关键字。
通过在方法或代码块前添加synchronized 关键字,可以保证同一时间只有一个线程访问被同步的代码。
3. 什么是线程安全?如何保证线程安全?线程安全是指多个线程访问共享资源时,不会出现数据不一致或者异常的情况。
可以通过使用同步机制(如synchronized关键字)、使用线程安全的数据结构(如ConcurrentHashMap)或者使用原子类(如AtomicInteger)来保证线程安全。
4. 什么是死锁?如何避免死锁?死锁是指两个或多个线程无法继续执行的情况,因为每个线程都在等待其他线程释放资源。
为了避免死锁,可以使用避免策略,如避免使用多个锁,按照相同的顺序获取锁,或者使用定时锁等。
5. 什么是线程池?为什么要使用线程池?线程池是一种管理和复用线程的机制,它可以提高线程的利用率和系统的性能。
通过使用线程池,可以避免频繁创建和销毁线程的开销,提供线程的复用和管理。
6. 什么是线程间通信?Java中如何实现线程间通信?线程间通信是指多个线程之间进行信息的传递和共享资源的协调。
在Java中,可以使用wait()、notify()和notifyAll()方法来实现线程间的等待和唤醒机制。
7. 什么是线程的生命周期?Java中线程的生命周期有哪些状态?线程的生命周期包括五个状态,新建状态、就绪状态、运行状态、阻塞状态和死亡状态。
线程会依次经历这些状态,直到最终结束。
8. 什么是线程调度?Java中如何进行线程调度?线程调度是指操作系统决定哪个线程可以执行的过程。
Java多线程习题

9、下列说法中错误的一项是( )。
A、Applet必须全部重写其生命周期方法
B、Applet不必全部重写其生命周期方法
C、Applet中使用了线程,则需要重写相应的生命周期方法
D、stop()总是在destroy()之前被调用。
B、用于建立与某个数据源的连接可采用DriverManager类的getConnection方法
C、建立数据库连接时,必须要进行异常处理
D JDBC中查询语句的执行方法必须采用Statement类实现
12、运行下列程序,会产生什么结果()
public class X extends Thread implements Runable{ public void run(){
18•实现线程体的方式除了继承Thread类,还可以实现接口。
E)A、Cloneable B、Runnable C、Iterable D、Serializable二、填空题
1、 若在高优先级线程的run()方法中调用_____方法,则该线程将让出CPU使其他 —
的线程获得CPU的使用权。
2、 通过实现Runnable接口创建线程的过程是:将实现Runnable的一个亠作为
Java
知识点:
Java的多线程,实现多线程的两种方法,线程控制、调度方法
一、选择题
1、什么原因可导致线程停止执行。 ( )
A.线程调用了wait()方法;
B.线程调用了yield()方法;
C.线程调用了pause()方法;
D.线程调用了sleep()方法。
2、 哪个方法是实现Runnable接口所需的?
13、下面哪个方法可以在任何时候被任何线程调用? ()
JAVA 练习题第12章--java多线程机制

连续输出10次带标号的“Hello!”
{
while(i++<10) { System.out.print(i+":Hello");
}
}
写出以下程序的功能: class TEST implements Runnable { public static void main(String args[]) {
TEST t=new TEST();
Thread tt=new Thread(t); tt.start(); }
改后才能符合A线程的需要,这时线程A就要等待 线程B完成修改工作,这种现象称为( ) A、线程的同步 B、线程的互斥 C、线程的调度 D、线程的就绪
A
最常使用的多线程实现方法是__________。
A、继承Thread类
B、继承Threader类 C、使用Runnable接口 D、使用Thread接口
C
线程在,新建和____
____状态调用isAlive()方法
返回的值是false。
死亡
7.在Java中,创建线程的方法有两种:
一种方法是通过(
另一种方法是通过(
)来实现, )来实现。
创建 Thread 类的子类 实现 Runnable 接口的类
8.(
)将启动线程对象,使之从新建状态转 入就绪状态并进入就绪队列排队。
Βιβλιοθήκη )。 A.线程一旦创建,则立即自动执行 B.线程创建后需要调用start()方法,将线程置于 可运行状态 C.调用线程的start()方法后,线程也不一定立即 执行 D.线程处于可运行状态,意味着它可以被调度 【解析】线程创建后需要调用start()方法,将线程 置于可运行状态。
java多线程练习题(打印版)

java多线程练习题(打印版)### Java多线程练习题#### 题目一:实现一个简单的线程编写一个Java程序,创建一个线程,该线程打印出从1到10的数字。
```javapublic class SimpleThread extends Thread {public void run() {for (int i = 1; i <= 10; i++) {System.out.println(i);}}public static void main(String[] args) {SimpleThread thread = new SimpleThread();thread.start();}}```#### 题目二:线程同步编写一个Java程序,创建两个线程,它们交替打印字符串"A"和"B",直到每个线程打印5次。
```javapublic class ThreadSync {private static final Object lock = new Object();public static void main(String[] args) {Thread threadA = new Thread(() -> {for (int i = 0; i < 5; i++) {synchronized (lock) {System.out.print("A");lock.notify();try {lock.wait();} catch (InterruptedException e) { e.printStackTrace();}}}});Thread threadB = new Thread(() -> {for (int i = 0; i < 5; i++) {synchronized (lock) {System.out.print("B");lock.notify();try {lock.wait();} catch (InterruptedException e) { e.printStackTrace();}}}});threadA.start();threadB.start();}}```#### 题目三:生产者-消费者问题编写一个Java程序,模拟生产者-消费者问题。
JAVA并发多线程的面试问题及答案

JAVA并发多线程的面试问题及答案多线程和并发问题是Java技术面试中面试官比较喜欢问的问题之一。
在这里,从面试的角度列出了大部分重要的问题,但是你仍然应该牢固的掌握Java多线程基础知识来对应日后碰到的问题。
下面就由为大家介绍一下JAVA并发多线程的面试问题及答案的文章,欢迎阅读。
JAVA并发多线程的面试问题及答案篇11)现在有T1、T2、T3三个线程,你怎样保证T2在T1执行完后执行,T3在T2执行完后执行?这个线程问题通常会在第一轮或电话面试阶段被问到后的是检测你对〃join”方法是否熟悉。
这个多线程问题比较简单,可以用join 方法实现。
2)在Java中Lock接口比synchronized块的优势是什么?你需要实现一个高效的缓存,它允许多个用户读,但只允许一个用户写,以此来保持它的完整性,你会怎样去实现它?lock接口在多线程和并发编程中最大的优势是它们为读和写分别提供了锁,它能满足你写像ConcurrentHashM叩这样的高性能数据结构和有条件的阻塞。
Java线程面试的问题越来越会根据面试者的回答来提问。
我强烈建议在你去参加多线程的面试之前认真读一下Locks,因为当前其大量用于构建电子交易终统的客户端缓存和交易连接空间。
3)在java中wait和sleep方法的不同通常会在电话面试中经常被问到的Java线程面试问题。
最大的不同是在等待时wait会释放锁,而sleep 一直持有锁。
Wait通常被用于线程间交互,sleep通常被用于暂停执行。
4)用Java实现阻塞队列。
这是一个相对艰难的多线程面试问题,它能达到很多的目的。
第一,它可以检测侯选者是否能实际的用Java线程写程序;第二,可以检测侯选者对并发场景的理解,并且你可以根据这个问很多问题。
如果他用wait ()和notify()方法来实现阻塞队列,你可以要求他用最新的Java 5中的并发类来再写一次。
JAVA并发多线程的面试问题及答案篇21)用Java写代码来解决生产者;;消费者问题。
多线程常见面试题及答案

多线程常见⾯试题及答案1、如何在Java中实现线程(4种)?1.继承Thread类,重写run⽅法(其实Thread类本⾝也实现了Runnable接⼝)2.实现Runnable接⼝,重写run⽅法3.实现Callable接⼝,重写call⽅法(有返回值)4.使⽤线程池(有返回值)2、在具体多线程编程实践中,如何选⽤Runnable还是Thread?Java中实现多线程有两种⽅法:继承Thread类、实现Runnable接⼝,在程序开发中只要是多线程,肯定永远以实现Runnable接⼝为主,因为实现Runnable接⼝相⽐继承Thread类有如下优势:1、可以避免由于Java的单继承特性⽽带来的局限;2、增强程序的健壮性,代码能够被多个线程共享,代码与数据是独⽴的;适合多个相同程序代码的线程区处理同⼀资源的情况。
3、Thread类中的start()和run()⽅法有什么区别?start()⽅法来启动线程,真正实现了多线程运⾏,这时⽆需等待run⽅法体代码执⾏完毕⽽直接继续执⾏下⾯的代码:通过调⽤Thread类的start()⽅法来启动⼀个线程,这时此线程是处于就绪状态,并没有运⾏。
然后通过此Thread类调⽤⽅法run()来完成其运⾏操作的,这⾥⽅法run()称为线程体,它包含了要执⾏的这个线程的内容,Run⽅法运⾏结束,此线程终⽌,⽽CPU再运⾏其它线程。
run()⽅法当作普通⽅法的⽅式调⽤,程序还是要顺序执⾏,还是要等待run⽅法体执⾏完毕后才可继续执⾏下⾯的代码:⽽如果直接⽤run⽅法,这只是调⽤⼀个⽅法⽽已,程序中依然只有主线程–这⼀个线程,其程序执⾏路径还是只有⼀条,这样就没有达到多线程的⽬的。
4、Java中Runnable和Callable有什么不同相同点:1. 两者都是接⼝;(废话)2. 两者都可⽤来编写多线程程序;3. 两者都需要调⽤Thread.start()启动线程;不同点:1. 两者最⼤的不同点是:实现Callable接⼝的任务线程能返回执⾏结果;⽽实现Runnable接⼝的任务线程不能返回结果;2. Callable接⼝的call()⽅法允许抛出异常;⽽Runnable接⼝的run()⽅法的异常只能在内部消化,不能继续上抛;注意点:Callable接⼝⽀持返回执⾏结果,此时需要调⽤FutureTask.get()⽅法实现,此⽅法会阻塞主线程直到获取‘将来’结果;当不调⽤此⽅法时,主线程不会阻塞!5、如何避免死锁?1. 加锁顺序按照顺序加锁是⼀种有效的死锁预防机制。
Java多线程习题

Java多线程习题知识点:Java的多线程,实现多线程的两种方法,线程控制、调度方法一、选择题1、什么原因可导致线程停止执行。
()A.线程调用了 wait()方法;B.线程调用了yield()方法;C.线程调用了 pause()方法;D.线程调用了 sleep() 方法。
2、哪个方法是实现Runnable接口所需的?A.wait() B.run() C.stop() D.update() E.resume() 3、以下代码的调试结果为?()public class Bground extends Thread{public static void main(String argv[]){Bground b = new Bground();b。
run();}public void start(){for (int i = 0; i <10; i++){System。
out.println("Value of i = " + i);}}}A.编译错误,没有定义线程的run方法;B.由于没有定义线程的run方法,而出现运行错误;C。
编译通过,运行输出 values 0 to 9D。
编译通过,运行无输出4、有关线程的叙述正确的有:()A.通过继承Thread类或实现Runnable接口,可以获得对类中方法的互斥锁定.B. 可以获得对任何对象的互斥锁定。
C。
线程通过调用对象的synchronized 方法可取得对象的互斥锁定。
D。
线程调度算法是平台独立的。
5、以下哪个是线程类的方法?A.yield()B. sleep(long msec)C。
go()D。
stop()6、以下哪个最准确描述synchronized关键字?A.允许两线程并行运行,而且互相通信;B. 保证在某时刻只有一个线程可访问方法或对象;C。
保证允许两个或更多处理同时开始和结束;D. 保证两个或更多线程同时开始和结束.7、于Java语言的内存回收机制,下列选项中最正确的一项是( )。
最全多线程经典面试题和答案

最全多线程经典⾯试题和答案Java实现线程有哪⼏种⽅式?1、继承Thread类实现多线程2、实现Runnable接⼝⽅式实现多线程3、使⽤ExecutorService、Callable、Future实现有返回结果的多线程多线程同步有哪⼏种⽅法?Synchronized关键字,Lock锁实现,分布式锁等。
Runnable和Thread⽤哪个好?Java不⽀持类的多重继承,但允许你实现多个接⼝。
所以如果你要继承其他类,也为了减少类之间的耦合性,Runnable会更好。
Java中notify和notifyAll有什么区别?notify()⽅法不能唤醒某个具体的线程,所以只有⼀个线程在等待的时候它才有⽤武之地。
⽽notifyAll()唤醒所有线程并允许他们争夺锁确保了⾄少有⼀个线程能继续运⾏。
为什么wait/notify/notifyAll这些⽅法不在thread类⾥⾯?这是个设计相关的问题,它考察的是⾯试者对现有系统和⼀些普遍存在但看起来不合理的事物的看法。
回答这些问题的时候,你要说明为什么把这些⽅法放在Object类⾥是有意义的,还有不把它放在Thread类⾥的原因。
⼀个很明显的原因是JAVA提供的锁是对象级的⽽不是线程级的,每个对象都有锁,通过线程获得。
如果线程需要等待某些锁那么调⽤对象中的wait()⽅法就有意义了。
如果wait()⽅法定义在Thread类中,线程正在等待的是哪个锁就不明显了。
简单的说,由于wait,notify和notifyAll都是锁级别的操作,所以把他们定义在Object类中因为锁属于对象。
为什么wait和notify⽅法要在同步块中调⽤?主要是因为Java API强制要求这样做,如果你不这么做,你的代码会抛出IllegalMonitorStateException异常。
还有⼀个原因是为了避免wait 和notify之间产⽣竞态条件。
什么是死锁?如何避免死锁?死锁就是两个线程相互等待对⽅释放对象锁。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
多线程
一.选择题
1.下列说法中错误的一项是(A)
A.线程就是程序
B.线程是一个程序的单个执行流
B.多线程是指一个程序的多个执行流D.多线程用于实现并发
2.下列哪个一个操作不能使线程从等待阻塞状态进入对象阻塞状态(D)
A.等待阴塞状态下的线程被notify()唤
B.等待阻塞状态下的纯种被interrput()中断
C.等待时间到
D.等待阻塞状态下的线程调用wait()方法
3.下列哪个方法可以使线程从运行状态进入其他阻塞状态(A)
A.sleep
B.wait
C.yield
D.start
4.下列说法中错误的一项是(D)
A.一个线程是一个Thread类的实例
B.线程从传递给纯种的Runnable实例run()方法开始执行
C.线程操作的数据来自Runnable实例
D.新建的线程调用start()方法就能立即进入运行状态
5.下列关于Thread类提供的线程控制方法的说法中,错误的一项是(D)
A.在线程A中执行线程B的join()方法,则线程A等待直到B执行完成
B.线程A通过调用interrupt()方法来中断其阻塞状态
C.若线程A调用方法isAlive()返回值为true,则说明A正在执行中
D.currentThread()方法返回当前线程的引用
6.下列说法中,错误的一项是()
A.对象锁在synchronized()语句执行完之后由持有它的线程返还
B.对象锁在synchronized()语句中出现异常时由持有它的线程返还
C.当持有锁的线程调用了该对象的wait()方法时,线程将释放其持有的锁
D.当持有锁的线程调用了该对象的构造方法时,线程将释放其持有的锁
7.下面的哪一个关键字通常用来对对象的加锁,从而使得对对象的访问是排他的A
A.sirialize B transient C synchronized D static
二.填空题
1.在操作系统中,被称做轻型的进程是线程
2.多线程程序设计的含义是可以将一个程序任务分成几个并行的任务
3.在Java程序中,run()方法的实现有两种方式:实现Runnable接口和继承Thread类
4.多个线程并发执行时,各个线程中语句的执行顺序是确定的,但是线程之间的相对执行顺序是不确定的
6.Java中的对象锁是一种独占的排他锁
7.程序中可能出现一种情况:多个线种互相等待对方持有的锁,而在得到对方的锁之前都不会释放自己的锁,这就是死锁
8.线程的优先级是在Thread类的常数MIN_PRIORITY和MAX_PRIORITY
之间的一个值
9.处于新建状态的线程可以使用的控制方法是start()和stop()。
10.一个进程可以包含多个线程
三.简答题
1.说明几个概念:对象锁、sleep、wait、notify、notifyAll
对象锁:每个对象都有对象锁,当某个线程进入用synchronized定义方法时,就获得了当前类对象(方法所属的类的对象)的锁,其他线程就不能再获得该锁,直到线程释放该锁。
一个类对象有一个对象锁,多个同步方法公用一个对象锁。
sleep:是当前线程处于休眠状态,将对cpu的控制权交给其他线程,但不释放当前对象的锁,其他线程可以获得cpu,但不能进入当前线程控制的对象锁。
wait:与sleep的区别是,它会释放对象锁,其他线程可以进入该同步块。
notify:进入当前同步块的线程调用wait方法变成休眠状态的线程,notify将该线程变成等待状态。
notifyAll:进入当前同步块的线程调用wait方法变成休眠状态,notifyAll使所有休眠线程变成等待状态。
一个类中有多个同步方法,进入任意一个同步块都将获得该对象锁,由于wait方法使进入同步块的线程休眠,notify只能唤醒所有被休眠线程中的一个,notifyAll可以唤醒所有休眠线程。
通常线程的通信通过wait,notifyAll和wait条件来实现。
2.java中有几种方法可以实现一个线程?用什么关键字修饰同步方法?S
有两种实现方法,分别是继承Thread类与实现Runnable接口
用synchronized关键字修饰同步方法
3.sleep()和wait()有什么区别?
答:sleep是线程类(Thread)的方法,导致此线程暂停执行指定时间,给执行机会给其他线程,但是监控状态依然保持,到时后会自动恢复。
调用sleep不会释放对象锁。
wait是Object类的方法,对此对象调用wait方法导致本线程放弃对象锁,进入等待此对象的等待锁定池,只有针对此对象发出notify方法(或notifyAll)后本线程才进入对象锁定池准备获得对象锁进入运行状态。
4.同步和异步有何异同,在什么情况下分别使用他们?举例说明。
答:如果数据将在线程间共享。
例如正在写的数据以后可能被另一个线程读到,或者正在读的数据可能已经被另一个线程写过了,那么这些数据就是共享数据,必须进行同步存取。
当应用程序在对象上调用了一个需要花费很长时间来执行的方法,并且不希望让程序等待方法的返回时,就应该使用异步编程,在很多情况下采用异步途径往往更有效率。
5.启动一个线程是用run()还是start()?
答:启动一个线程是调用start()方法,使线程所代表的虚拟处理机处于可运行状态,这意味着它可以由JVM调度并执行。
这并不意味着线程就会立即运行。
run()方法可以产生必须退出的标志来停止一个线程。
6.多线程有几种实现方法,都是什么?同步有几种实现方法,都是什么?
答:多线程有两种实现方法,分别是继承Thread类与实现Runnable接口
同步的实现方面有两种,分别是synchronized,wait与notify
7.线程的基本状态以及状态之间的关系
Java中的线程有四种状态分别是:运行、就绪、挂起、结束。