全⾯的多线程⾯试题含答案(37道⾯试题)
多线程⾯试题:
1.什么是线程,什么是进程,它们有什么区别和联系,⼀个进程⾥⾯是否必须有个线程
(先讲进程)
答案
进程本质上是⼀个执⾏的程序,⼀个进程可以有多个线程。它允许计算机同时运⾏两个或多个程序。⼀个进程⾄少会有⼀个线程。线程是进程的最⼩执⾏单位。
区别:多进程程序不受Java的控制,⽽多线程则受Java控制。多线程⽐多进程需要更少的管理费⽤。
2.实现⼀个线程有哪⼏种⽅式,各有什么优缺点,⽐较常⽤的是那种,为什么
答案
线程有3种实现⽅式:
①.通过继承Thread类,优点:可以直接调⽤start⽅法启动。缺点:继承⼀个类后,不能再继承别的类。需要重写run⽅法。⽆返回值。
②.实现Runnable接⼝,优点:可以实现多个接⼝或继承⼀个类;缺点:不能直接启动,要通过构造⼀个Thread把⾃⼰传进去。需要重写run⽅法,⽆返回值。
③.实现Callable接⼝,优点:可以抛出异常,有返回值;缺点:只有jkd1.5以后才⽀持。需要重写call⽅法。结合FutureTask和Thread类⼀起使⽤,最后调⽤start启动。
⼀般最常⽤的是第⼆种,实现Runnable接⼝。⽐较⽅便,可扩展性⾼。
3. ⼀般情况下我们实现⾃⼰线程时候要重写什么⽅法
答案
使⽤Thread类,要重写run⽅法,或实现Runnable接⼝时,要实现run()⽅法
使⽤Callable接⼝时,要重写call⽅法,且有返回值。
4.start⽅法和run⽅法有什么区别,我们⼀般调⽤的那个⽅法,系统调⽤的是那个⽅法
答案
start⽤于启动线程,当调⽤start后,线程并不会马上运⾏,⽽是处于就绪状态,是否要运⾏取决于cpu给的时间⽚。
run⽤于⼦类重写来实现线程的功能。
我们⼀般调⽤的是start⽅法,系统调⽤的是run⽅法。
5.sleep⽅法有什么作⽤,⼀般⽤来做什么
答案
sleep是⼀个Thread类的静态⽅法,让调⽤它的线程休眠指定的时间,可⽤于暂停线程,但不会把锁让给其他线程,时间⼀到,线程会继续执⾏。
6. 讲下join,yield⽅法的作⽤,以及什么场合⽤它们
答案
join线程有严格的先后顺序,调⽤它的线程需要执⾏完以后其他线程才会跟着执⾏。
yield是暂停当前正在执⾏的线程对象,把时间让给其他线程。
使⽤场合:join线程有严格的先后顺序,yield当前线程占⽤cpu使⽤率很⾼时,把时间让出来。(死循环时)
7.线程中断是否能直接调⽤stop,为什么?
答案
不可以,stop⽅法是从外部强⾏终⽌⼀个线程,会导致不可预知的错误。如使⽤IO流时不能关流
8.列举出⼀般情况下线程中断的⼏种⽅式,并说明他们之间的优缺点,并且说明那种中断⽅式最好
答案
中断线程有4种⽅式:
①.由interrupt发出中断信号,⽤户接收中断信号,通过isInterrupted判断线程是否中断。
②.由interrupt发出中断信号,系统接收中断信号,通过sleep抛出中断异常,并把中断信号清除,只能抛出⼀次。
③.⽤户⾃定义中断信号,并将该信号发出,⾃⼰接收该中断信号。
④.调⽤interrupted(),会把中断信号清除,并中断线程。
9.线程有⼏种状态,他们是怎么转化的
答案
线程⼀般分为:新⽣、可运⾏、运⾏、阻塞、死亡五种状态。
当创建⼀个线程后,并没有运⾏,还处于新⽣状态,需要通过调⽤start⽅法,让线程处于可运⾏状态,但是否运⾏取决cpu分配的时间⽚,当得到cpu的时间⽚后,线程就会马上运⾏,⼀个正在执⾏的线程可以通过很多⽅式进⼊阻塞状态(等待输⼊/输出 ,sleep,wait,get)当执⾏完所有操作后就进⼊死亡状态。
10.在实现Runnable的接⼝中怎么样访问当前线程对象,⽐如拿到当前线程的名字
答案
通过currentThread()⽅法访问当前线程对象,通过getName()可获得当前线程的名字。
11. 讲下什么是守护线程,以及在什么场合来使⽤它
答案
守护线程⼀般在后台提供通⽤性⽀持,只有⾮守护线程全部退出时,守护线程才会退出。
当主线程和主线程创建的⼦线程全部退出,守护线程⼀定会跟着退出。
12.⼀般的线程优先级是什么回事,线程优先级⾼的线程⼀定会先执⾏吗?如果不设置优先级的话,那么线程优先级是多少,设置线程优先级⽤那个函数
答案
线程的优先级就是设置哪个线程优先执⾏,但也不是绝对的,只是让优先级⾼的线程优先运⾏的⼏率⾼⼀些。线程默认是
NORM_PRIORITY = 5; 设置优先级使⽤的是setPriority()函数。
13.为什么Thread⾥⾯的⼤部分⽅法都是final的
答案
不能被重写,线程的很多⽅法都是由系统调⽤的,不能通过⼦类覆写去改变他们的⾏为。
14.什么是线程同步,什么是线程安全
答案
当两个或两个以上的线程需要共享资源,他们就需要某种⽅法来确定资源在某⼀刻仅被⼀个线程占⽤。
线程安全就是多线程操作同⼀个对象不会有问题,线程同步⼀般来保护线程安全,final修饰的也是线程安全
15.讲下同步⽅法和同步块的区别,以及什么时候⽤它们
答案
同步⽅法就是被synchronized修饰的⽅法,同步整个⽅法,且整个⽅法都会被锁住,同⼀时间只有⼀个线程可以访问该⽅法。整个业务,缺点:性能差
同步块就是使⽤synchronized修饰的代码块,可以同步⼀⼩部分代码
同步块越⼩性能越好,当性能要求⽐较⾼时,⽤同步块
16.简单说下Lock对象的实现类的锁机制和同步⽅法或同步块有什么区别
答案
答:可重⼊锁是jdk1.5以后出现的,⽐同步⽅法或同步块更加灵活,可以控制在什么时候上锁,什么时候解锁,⽽使⽤同步块或同步⽅法后,必须要等代码执⾏完后才会解锁。
17. 同步块⾥⾯的同步监视器是怎么写的,默认的同步⽅法⾥⾯的同步监视器是那个
答案
synchronized(对象){
//代码块
}
默认的同步监视器this
18.讲下什么 是死锁,死锁发⽣的⼏个条件是什么
答案
死锁就是当有两个或两个以上的线程都获得对⽅的资源,但彼此有不肯放开,处于僵持状态,此时便造成了死锁。
条件:两个或两个以上的线程
同时想要获取对⽅的资源,彼此⼜不肯放开
19.线程间是什么通信的,通过调⽤⼏个⽅法来交互的
答案
线程间是通过相互作⽤,共同完成⼀个任务当⼀个线程调⽤wait⽅法后便进⼊等待状态,需要另⼀线程调⽤notify()⽅法对它进⾏唤醒。notifyAll可以唤醒所有线程,都必须在synchronized⽅法或synchronized块⾥使⽤
20.wait,notify,notifyAll在什么地⽅使⽤才有效,他们是那个类的⽅法
答案
wait ,notify , notifyAll都必须在synchronized修饰的⽅法或synchronized块中使⽤,都属于Object的⽅法,可以被所有类继承,都是final修饰的⽅法,不能通过⼦类覆写去改变他们的⾏为。
21.wait和sleep有什么区别和联系,他们执⾏的时候是否都会释放锁
答案
wait和sleep都可以使线程暂停,但wait必须在synchronized修饰的⽅法或synchronized块中使⽤,wait可以使锁定解除,⽽sleep不会解锁,wait不被唤醒是⼀直会在等待,⽽sleep会在休眠时间结束之后便会执⾏
22.yield,sleep⽅法有什么区别和联系
答案
yield和sleep都是可以让线程暂停,但yield会暂停当前正在执⾏的线程,把时间⽚让给其他线程,⽽sleep虽然也是暂停当前线程,但只会暂停指定的时间,不会把同步锁让给其他线程,时间到了当前线程还会继续执⾏。
一个线程可以包含多个进程23 .sleep()和wait()的区别。
wait和sleep都可以使线程暂停,但wait必须在synchronized修饰的⽅法或synchronized块中使⽤,wait可以使锁定解除,⽽sleep不会解锁,wait不被唤醒是⼀直会在等待,⽽sleep会在休眠时间结束之后便会执⾏
24.线程的启动是哪个⽅法,调⽤的是哪个⽅法?
start⽤于启动线程,当调⽤start后,线程并不会马上运⾏,⽽是处于就绪状态,是否要运⾏取决于cpu给的时间⽚。
run⽤于⼦类重写来实现线程的功能。
我们⼀般调⽤的是start⽅法,系统调⽤的
是run⽅法。
25.线程安全与线程不安全的区别
当两个或两个以上的线程需要共享资源,他们就需要某种⽅法来确定资源在某⼀刻仅被⼀个线程占⽤。
线程安全就是多线程操作同⼀个对象不会有问题,线程同步⼀般来保护线程安全,final修饰的也是线程安全
26.线程的实现⽅式,线程的⽣命周期等
1.线程的⽣命周期线程是⼀个动态执⾏的过程,它也有⼀个从产⽣到死亡的过程。
(1)⽣命周期的五种状态
新建(new Thread)当创建Thread类的⼀个实例(对象)时,此线程进⼊新建状态(未被启动)。
例如:Thread t1=new Thread();
就绪(runnable)线程已经被启动,正在等待被分配给CPU时间⽚,也就是说此时线程正在就绪队列中排队等候得到CPU资源。例如:
t1.start();
运⾏(running)线程获得CPU资源正在执⾏任务(run()⽅法),此时除⾮此线程⾃动放弃CPU资源或者有优先级更⾼的线程进⼊,线程将⼀直运⾏到结束。
死亡(dead)
当线程执⾏完毕或被其它线程杀死,线程就进⼊死亡状态,这时线程不可能再进⼊就绪状态等待执⾏。
⾃然终⽌:正常运⾏run()⽅法后终⽌
异常终⽌:调⽤stop()⽅法让⼀个线程终⽌运⾏
堵塞(blocked)
由于某种原因导致正在运⾏的线程让出CPU并暂停⾃⼰的执⾏,即进⼊堵塞状态。
正在睡眠:⽤sleep(long t) ⽅法可使线程进⼊睡眠⽅式。⼀个睡眠着的线程在指定的时间过去可进⼊就绪状态。
正在等待:调⽤wait()⽅法。(调⽤motify()⽅法回到就绪状态)
被另⼀个线程所阻塞:调⽤suspend()⽅法。(调⽤resume()⽅法恢复)
27.如何处理线程不安全问题 有2种解决⽅法。
1.放在栈⾥⾯的数据都是线程安全
2.同步块,同步关键字修饰的都是线程安全
3.final修饰的变量都是线程安全
4.ThreadLoacl放置的变量可以解决线程安全
5.可以考虑JDK5提供的线程安全集合和类
第⼀,是采⽤原⼦变量,毕竟线程安全问题最根本上是由于全局变量和静态变量引起的,只要保证了对于变量的写操作要么全写要么不写,就可以解决线程安全,定义变量⽤sig_atomic_t和volatile。
第⼆,就是实现线程间同步啦,⽤互斥锁,信号量。让线程有序的访问变量就可以啦
28.线程中常⽤⽅法的区别,
⾸先,线程中最多⽤到的是start⽅法,它的作⽤是⽤来启动⼀个线程。(⼀个Thread类的对象就是⼀个线程,⽤这个对象.start()就是启动⼀个线程)
其次,线程中⽤的多的就是sleep,join,wait这种会引发InterruptedException异常的⽅法,
sleep是⽤来休眠⼀个线程⼀段时间,
join是⽤来强制执⾏⼀个线程,
wait这个⽅法是Object类中的⽅法,⽤于等待。
除yield(),礼让的意思就是让另外⼀个线程执⾏⼀会,然后⾃⼰再执⾏,不同于sleep。
还有获得当前线程的对象,这个⽅法也很重要,currentThread()。
对于线程中,还应了解到线程的死锁的概念,不需要掌握这个概念,但是应该知道可以通过哪些途径避免死锁,java中提供了使⽤Synchronized关键字和Synchronized同步⽅法来解决。
29.多线程和单线程有什么区别?
单线程的也就是程序执⾏时,所跑的程序路径(处理的东西)是连续顺序下来的,必须前⾯的处理好,后⾯的彩绘执⾏到。
多线程嘛,举个例⼦也就是说程序可以同时执⾏2个以上相同类似的操作,⽐如⼀些搜索代理或者发email的多线程软件,由于操作⼀次需要⽹络的返回信 息 花的时间⽐较长,⽽对cpu来说却是空闲的,
如果是⼀个⼀个顺序执⾏,那么搜索⼏千个IP就会花上好久好久。 ⽽如果⽤多线程就可以在等待期间 加⼊ 其他的搜索,然后等待,这样可以提⾼效率。
30.线程的四种状态,__、_、_、___。启动调⽤_⽅法,启动后会调⽤__⽅法。
四种状态:新(new) 可执⾏(runnable)堵塞(blocked)死(dead)
启动调⽤start 启动后调⽤run
31.⽤同步块与同步⽅法的区别?
同步⽅法就是被synchronized修饰的⽅法,同步整个⽅法,且整个⽅法都会被锁住,同⼀时间只有⼀个线程可以访问该⽅法。整个业务,缺点:性能差
同步块就是使⽤synchronized修饰的代码块,可以同步⼀⼩部分代码
同步块越⼩性能越好,当性能要求⽐较⾼时,⽤同步块
32.写⼆个线程,对⼀个int类型⼀个i++,⼀个i--
public class ThreadTest implements Runnable{
public void run() {
for (int i = 0; i < 10; i++) {
System.out.println("我是⼦线程"+i);
}
}
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论