多线程面试题

多线程面试题:

1.什么是线程,什么是进程,它们有什么区别和联系,一个进程里面是否必须有个线程

(先讲进程)

答案

Icon

进程本质上是一个执行的程序,一个进程可以有多个线程。它允许计算机同时运行两个或多个程序。一个进程至少会有一个线程。线程是进程的最小执行单位。
区别:多进程程序不受Java的控制,而多线程则受Java控制。多线程比多进程需要更少的管理费用。


2.实现一个线程有哪几种方式,各有什么优缺点,比较常用的是那种,为什么

答案

Icon
线程有3种实现方式:
①.通过继承Thread类,优点:可以直接调用start方法启动。缺点:继承一个类后,不能再继承别的类。需要重写run方法。无返回值。
②.实现Runnable接口,优点:可以实现多个接口或继承一个类;缺点:不能直接启动,要通过构造一个Thread把自己传进去。需要重写run方法,无返回值。
③.实现Callable接口,优点:可以抛出异常,有返回值;缺点:只有jkd1.5以后才支持。需要重写call方法。结合FutureTask和Thread类一起使用,最后调用start启动。
一般最常用的是第二种,实现Runnable接口。比较方便,可扩展性高。

3. 一般情况下我们实现自己线程时候要重写什么方法

答案

Icon
 使用Thread类,要重写run方法,或实现Runnable接口时,要实现run()方法
使用Callable接口时,要重写call方法,且有返回值。


4.start方法和run方法有什么区别,我们一般调用的那个方法,系统调用的是那个方法

答案

Icon
 

start用于启动线程,当调用start后,线程并不会马上运行,而是处于就绪状态,是否要运行取决于cpu给的时间片。
run用于子类重写来实现线程的功能。
我们一般调用的是start方法,系统调用的是run方法。

5.sleep方法有什么作用,一般用来做什么

答案

Icon
sleep是一个Thread类的静态方法,让调用它的线程休眠指定的时间,可用于暂停线程,但不会把锁让给其他线程,时间一到,线程会继续执行。

6. 讲下join,yield方法的作用,以及什么场合用它们

答案

Icon
 
join线程有严格的先后顺序,调用它的线程需要执行完以后其他线程才会跟着执行。
yield是暂停当前正在执行的线程对象,把时间让给其他线程。
使用场合:join线程有严格的先后顺序,yield当前线程占用cpu使用率很高时,把时间让出来。(死循环时)

7.线程中断是否能直接调用stop,为什么?

答案

Icon
不可以,stop方法是从外部强行终止一个线程,会导致不可预知的错误。如使用IO流时不能关流

  

8.列举出一般情况下线程中断的几种方式,并说明他们之间的优缺点,并且说明那种中断方式最好

答案

Icon

中断线程有4种方式:
①.由interrupt发出中断信号,用户接收中断信号,通过isInterrupted判断线程是否中断。
②.由interrupt发出中断信号,系统接收中断信号,通过sleep抛出中断异常,并把中断信号清除,只能抛出一次。
③.用户自定义中断信号,并将该信号发出,自己接收该中断信号。
④.调用interrupted(),会把中断信号清除,并中断线程。

 

9.线程有几种状态,他们是怎么转化的

答案

Icon
线程一般分为:新生、可运行、运行、阻塞、死亡五种状态。
当创建一个线程后,并没有运行,还处于新生状态,需要通过调用start方法,让线程处于可运行状态,但是否运行取决cpu分配的时间片,当得到cpu的时间片后,线程就会马上运行,一个正在执行的线程可以通过很多方式进入阻塞状态(等待输入/输出 ,sleep,wait,get)当执行完所有操作后就进入死亡状态。

  

10.在实现Runnable的接口中怎么样访问当前线程对象,比如拿到当前线程的名字

答案

Icon
通过currentThread()方法访问当前线程对象,通过getName()可获得当前线程的名字。

11. 讲下什么是守护线程,以及在什么场合来使用它

答案

Icon
  守护线程一般在后台提供通用性支持,只有非守护线程全部退出时,守护线程才会退出。
当主线程和主线程创建的子线程全部退出,守护线程一定会跟着退出。


12.一般的线程优先级是什么回事,线程优先级高的线程一定会先执行吗?如果不设置优先级的话,那么线程优先级是多少,设置线程优先级用那个函数

答案

Icon
  线程的优先级就是设置哪个线程优先执行,但也不是绝对的,只是让优先级高的线程优先运行的几率高一些。线程默认是NORM_PRIORITY = 5; 设置优先级使用的是setPriority()函数。

13.为什么Thread里面的大部分方法都是final的

答案

Icon
  不能被重写,线程的很多方法都是由系统调用的,不能通过子类覆写去改变他们的行为。

14.什么是线程同步,什么是线程安全

答案

Icon

当两个或两个以上的线程需要共享资源,他们就需要某种方法来确定资源在某一刻仅被一个线程占用。
线程安全就是多线程操作同一个对象不会有问题,线程同步一般来保护线程安全,final修饰的也是线程安全

15.讲下同步方法和同步块的区别,以及什么时候用它们

答案

Icon

同步方法就是被synchronized修饰的方法,同步整个方法,且整个方法都会被锁住,同一时间只有一个线程可以访问该方法。整个业务,缺点:性能差
同步块就是使用synchronized修饰的代码块,可以同步一小部分代码
同步块越小性能越好,当性能要求比较高时,用同步块

16.简单说下Lock对象的实现类的锁机制和同步方法或同步块有什么区别

答案

Icon
  答:可重入锁是jdk1.5以后出现的,比同步方法或同步块更加灵活,可以控制在什么时候上锁,什么时候解锁,而使用同步块或同步方法后,必须要等代码执行完后才会解锁。


17. 同步块里面的同步监视器是怎么写的,默认的同步方法里面的同步监视器是那个

答案

Icon
  synchronized(对象){
//代码块
}
默认的同步监视器this


18.讲下什么 是死锁,死锁发生的几个条件是什么

答案

Icon
 

死锁就是当有两个或两个以上的线程都获得对方的资源,但彼此有不肯放开,处于僵持状态,此时便造成了死锁。
条件:两个或两个以上的线程
同时想要获取对方的资源,彼此又不肯放开

19.线程间是什么通信的,通过调用几个方法来交互的

答案

Icon
 

线程间是通过相互作用,共同完成一个任务当一个线程调用wait方法后便进入等待状态,需要另一线程调用notify()方法对它进行唤醒。notifyAll可以唤醒所有线程,都必须在synchronized方法或synchronized块里使用

20.wait,notify,notifyAll在什么地方使用才有效,他们是那个类的方法

答案

Icon
  wait ,notify , notifyAll都必须在synchronized修饰的方法或synchronized块中使用,都属于Object的方法,可以被所有类继承,都是final修饰的方法,不能通过子类覆写去改变他们的行为。

  21.wait和sleep有什么区别和联系,他们执行的时候是否都会释放锁

答案

Icon
  wait和sleep都可以使线程暂停,但wait必须在synchronized修饰的方法或synchronized块中使用,wait可以使锁定解除,而sleep不会解锁,wait不被唤醒是一直会在等待,而sleep会在休眠时间结束之后便会执行

22.yield,sleep方法有什么区别和联系

答案

Icon
  yield和sleep都是可以让线程暂停,但yield会暂停当前正在执行的线程,把时间片让给其他线程,而sleep虽然也是暂停当前线程,但只会暂停指定的时间,不会把同步锁让给其他线程,时间到了当前线程还会继续执行。

sleep()和wait()的区别。

Icon
wait和sleep都可以使线程暂停,但wait必须在synchronized修饰的方法或synchronized块中使用,wait可以使锁定解除,而sleep不会解锁,wait不被唤醒是一直会在等待,而sleep会在休眠时间结束之后便会执行

线程的启动是哪个方法,调用的是哪个方法?

Icon
start用于启动线程,当调用start后,线程并不会马上运行,而是处于就绪状态,是否要运行取决于cpu给的时间片。
run用于子类重写来实现线程的功能。
我们一般调用的是start方法,系统调用的
是run方法。


线程安全与线程不安全的区别

Icon
当两个或两个以上的线程需要共享资源,他们就需要某种方法来确定资源在某一刻仅被一个线程占用。
线程安全就是多线程操作同一个对象不会有问题,线程同步一般来保护线程安全,final修饰的也是线程安全


线程的实现方式,线程的生命周期等

Icon
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()方法恢复)

如何处理线程不安全问题 有2种解决方法。

Icon

1.放在栈里面的数据都是线程安全

2.同步块,同步关键字修饰的都是线程安全

3.final修饰的变量都是线程安全

4.ThreadLoacl放置的变量可以解决线程安全

5.可以考虑JDK5提供的线程安全集合和类

第一,是采用原子变量,毕竟线程安全问题最根本上是由于全局变量和静态变量引起的,只要保证了对于变量的写操作要么全写要么不写,就可以解决线程安全,定义变量用sig_atomic_t和volatile。
第二,就是实现线程间同步啦,用互斥锁,信号量。让线程有序的访问变量就可以啦

线程中常用方法的区别

Icon

首先,线程中最多用到的是start方法,它的作用是用来启动一个线程。(一个Thread类的对象就是一个线程,用这个对象.start()就是启动一个线程)
其次,线程中用的多的就是sleep,join,wait这种会引发InterruptedException异常的方法,

sleep是用来休眠一个线程一段时间,

join是用来强制执行一个线程,

wait这个方法是Object类中的方法,用于等待。
除yield(),礼让的意思就是让另外一个线程执行一会,然后自己再执行,不同于sleep。
还有获得当前线程的对象,这个方法也很重要,currentThread()。
对于线程中,还应了解到线程的死锁的概念,不需要掌握这个概念,但是应该知道可以通过哪些途径避免死锁,java中提供了使用Synchronized关键字和Synchronized同步方法来解决。

多线程和单线程有什么区别?

Icon
单线程的也就是程序执行时,所跑的程序路径(处理的东西)是连续顺序下来的,必须前面的处理好,后面的彩绘执行到。 
多线程嘛,举个例子也就是说程序可以同时执行2个以上相同类似的操作,比如一些搜索代理或者群发email的多线程软件,由于操作一次需要网络的返回信 息 花的时间比较长,而对cpu来说却是空闲的,如果是一个一个顺序执行,那么搜索几千个IP就会花上好久好久。 而如果用多线程就可以在等待期间 加入 其他的搜索,然后等待,这样可以提高效率。


线程的四种状态,_______。启动调用_方法,启动后会调用__方法

Icon
四种状态:新(new) 可执行(runnable)堵塞(blocked)死(dead)
启动调用start 启动后调用run

用同步块与同步方法的区别?

Icon
同步方法就是被synchronized修饰的方法,同步整个方法,且整个方法都会被锁住,同一时间只有一个线程可以访问该方法。整个业务,缺点:性能差
同步块就是使用synchronized修饰的代码块,可以同步一小部分代码
同步块越小性能越好,当性能要求比较高时,用同步块

写二个线程,对一个int类型一个i++,一个i--

Icon
public class ThreadTest implements Runnable{ 
@Override
public void run() {
for (int i = 0; i < 10; i++) {
System.out.println("我是子线程"+i); 

}
public static void main(String[] args) {
Runnable runnable=new ThreadTest();
Thread thread=new Thread(runnable);
thread.start();
for (int i = 10; i >0; i--) {
System.out.println("我是主线程"+i); 
}

}

说说stop为什么不建议使用。

Icon
stop()方法作为一种粗暴的线程终止行为,在线程终止之前没有对其做任何的清除操作,因此具有固有的不安全性。


Runable接口的方法是什么?

Icon
run


什么是同步和异步,分别用例子说明,同步有几种方式?

Icon

同步就是排队去做事情,异步就是各做各的


什么是对象锁?

Icon
对象锁。同一时间只保证 一个线程访问方法或变量。
在Java语言中,通过被关键字synchronized修饰的方法或synchronized语句块实现对代码的同步
包含在synchronized方法或语句块中的代码称为被同步的代码(Synchronized Code)
当线程访问被同步的代码时,必须首先竞争代码所属的类的【对象上的锁】,否则线程将等待(阻塞),直到锁被释放.
列子:
同步语句(synchronized statements)的一般形式如下:
synchronized(<锁对象引用>){
…被同步的代码…



线程的死锁问题

Icon
死锁就是当有两个或两个以上的线程都获得对方的资源,但彼此有不肯放开,处于僵持状态,此时便造成了死锁。
条件:两个或两个以上的线程
同时想要获取对方的资源,彼此又不肯放开


"5.下列哪个是Runable接口的方法()

Icon
A.run B.start C.yicld D.stop

答:A

写一个生产者-消费者模型

 

Icon
code...

转载于:https://www.cnblogs.com/t0404/p/10291031.html

你可能感兴趣的:(多线程面试题)