全面的多线程面试题含答案(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{

@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);

}

}

}

34.说说stop为什么不建议使用

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

35.Runable接口的方法是什么?

run

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

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

36.什么是对象锁?

对象锁。同一时间只保证 一个线程访问方法或变量。

在Java语言中,通过被关键字synchronized修饰的方法或synchronized语句块实现对代码的同步

包含在synchronized方法或语句块中的代码称为被同步的代码(Synchronized Code)

当线程访问被同步的代码时,必须首先竞争代码所属的类的【对象上的锁】,否则线程将等待(阻塞),直到锁被释放.

列子:

同步语句(synchronized statements)的一般形式如下:

synchronized(<锁对象引用>){

…被同步的代码…

}

37.线程的死锁问题

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

条件:两个或两个以上的线程

同时想要获取对方的资源,彼此又不肯放开

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

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

"

答:A

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

code...

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 212,657评论 6 492
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,662评论 3 385
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 158,143评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,732评论 1 284
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,837评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,036评论 1 291
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,126评论 3 410
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,868评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,315评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,641评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,773评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,470评论 4 333
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,126评论 3 317
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,859评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,095评论 1 267
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,584评论 2 362
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,676评论 2 351

推荐阅读更多精彩内容

  • 进程和线程 进程 所有运行中的任务通常对应一个进程,当一个程序进入内存运行时,即变成一个进程.进程是处于运行过程中...
    胜浩_ae28阅读 5,091评论 0 23
  • 本文主要讲了java中多线程的使用方法、线程同步、线程数据传递、线程状态及相应的一些线程函数用法、概述等。在这之前...
    4ea0af17fd67阅读 587评论 2 17
  • Java多线程学习 [-] 一扩展javalangThread类 二实现javalangRunnable接口 三T...
    影驰阅读 2,952评论 1 18
  • 本文主要讲了java中多线程的使用方法、线程同步、线程数据传递、线程状态及相应的一些线程函数用法、概述等。 首先讲...
    李欣阳阅读 2,444评论 1 15
  • 米小圈你们总知道他一年级跟李黎有仇,等到四年级李黎还欺负米小圈,她老告米小圈的告状。有一次米小圈他没写作业李黎告诉...
    燕子_0e63阅读 1,262评论 0 0