多线程经典面试题及答案

java实现线程有哪几种方式

1.继承Thread类实现多线程
2.实现Runnable接口方式实现多线程
3.使用线程池:如ExecutorService,Callable,Future
第一种和第二种方式相比:java类只能允许继承一个父类,可以实现多个接口;其次,在第一种方式中用this可以获取当前线程,第二种方式获取当前线程只能通过Thread.currentThread()
第三种:线程的创建和释放,需要占用不小的内存和资源。如果每次需要使用线程时,都new 一个Thread的话,难免会造成资源的浪费,而且可以无限制创建,之间相互竞争,会导致过多占用系统资源导致系统瘫痪, ExecutorService是Java提供的线程池

public ThreadPoolExecutor(int corePoolSize,
                              int maximumPoolSize,
                              long keepAliveTime,
                              TimeUnit unit,
                              BlockingQueue<Runnable> workQueue,
                              ThreadFactory threadFactory,

corePoolSize:核心线程数
maximumPoolSize:最大线程数
poolSize:线程池中当前线程的数量
那么poolSize、corePoolSize、maximumPoolSize三者的关系是如何的呢?
当新提交一个任务时:
(1)如果poolSize<corePoolSize,新增加一个线程处理新的任务。
(2)如果poolSize=corePoolSize,新任务会被放入阻塞队列等待。
(3)如果阻塞队列的容量达到上限,且这时poolSize<maximumPoolSize,新增线程来处理任务。
(4)如果阻塞队列满了,且poolSize=maximumPoolSize,那么线程池已经达到极限,会根据饱和策略RejectedExecutionHandler拒绝新的任务
ExecutorService分为以下几种线程池:可缓存线程池newCachedThreadPool(),其中创建的都是非核心线程,;单线程newSingleThreadExecutor();
固定线程池newFixedThreadPool(3);定时线程池

线程同步有哪几种方法

Synchronized,Lock锁,分布式锁
Synchronized,Lock锁的区别:
1.Synchronized是java内置关键字,Lock是java 类 Lock lock = new ReentrantLock()
2.synchronized无法判断是否获取锁的状态,Lock可以判断是否获取锁lock.tryLock()
3.synchronized的锁可重入、不可中断、非公平,而Lock锁可重入、可判断、可公平
4.Lock锁适合大量同步的代码的同步问题,synchronized锁适合代码少量的同步问题
5.synchronized会自动释放锁(a 线程执行完同步代码会释放锁 ;b 线程执行过程中发生异常会释放锁),Lock需在finally中手工释放锁(unlock()方法释放锁),否则容易造成线程死锁;
6.用synchronized关键字的两个线程1和线程2,如果当前线程1获得锁,线程2线程等待。如果线程1阻塞,线程2则会一直等待下去,而Lock锁就不一定会等待下去,如果尝试获取不到锁,线程可以不用一直等待就结束了//lock.tryLock(3000, TimeUnit.MILLISECONDS) //尝试获取锁 获取不到锁,就等3秒,如果3秒后还是获取不到就返回false

synchronized与volatile区别

同步块(或方法)和 volatile 变量。这两种机制的提出都是为了实现代码线程的安全性。其中 Volatile 变量的同步性较差(但有时它更简单并且开销更低),而且其使用也更容易出错。volatile关键字用于声明简单类型变量,如int、float、boolean等数据类型。如果这些简单数据类型声明为volatile,对它们的操作就会变成原子级别的。但这有一定的限制。并不是只要简单类型变量使用volatile修饰,对这个变量的所有操作都是原来操作,当变量的值由自身的上一个决定时,如n=n+1、n++等,volatile关键字将失效,只有当变量的值和自身上一个值无关时对该变量的操作才是原子级别的,如n = m + 1,这个就是原级别的。所以在使用volatile关键时一定要谨慎,如果自己没有把握,可以使用synchronized来代替volatile。

java中notify和notifyAll的区别

notify方法不能唤醒某个具体的线程,而notifyAll唤醒所有的线程并允许他们争夺锁,确保至少有一个线程能继续运行

为什么wait/notify/notifyAll这些方法不在thread类里面

一个明显的原因就是java提供的锁是对象级而不是线程级。每个对象都有锁,通过线程获得。如果线程需要等待某些锁那么调用对象中wait方法才有意义

什么是死锁

死锁是两个线程相互等待对方释放对象锁

启动线程方法start()和run()有什么区别

只有调用了start方法,才会表现多线程的特性,不同线程的run方法里面的带脉交替执行。如果只是调用了run方法,那么代码还是同步执行,必须等待一个线程的run方法里面的代码全部执行完,才会执行其自己的run方法里面的代码

多线程通信

wait/notify

java中用到了什么线程调度算法

抢占式。一个线程的cpu用完后,操作系统会根据线程优先级,线程饥饿情况等情况分配某个线程

synchronized有哪几种用法

锁类,锁方法,锁代码块

活锁,饥饿,无锁,死锁

死锁:多个线程互相占用对方资源的锁,又相互等待对方释放锁,若无外力干涉,这些线程则一直处于阻塞你的假死状态,形成死锁
活锁:指拿到资源却又相互释放不执行,这个资源在多个线程之间跳动又得不到执行
饥饿:指优先级高的线程一直占着优先级低的资源,导致优先级低的线程无法得到执行,处于长久等待中

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

推荐阅读更多精彩内容

  • 【JAVA 线程】 线程 进程:是一个正在执行中的程序。每一个进程执行都有一个执行顺序。该顺序是一个执行路径,或者...
    Rtia阅读 2,758评论 2 20
  • 所有知识点已整理成app app下载地址 J2EE 部分: 1.Switch能否用string做参数? 在 Jav...
    侯蛋蛋_阅读 2,407评论 1 4
  • 线程池ThreadPoolExecutor corepoolsize:核心池的大小,默认情况下,在创建了线程池之后...
    irckwk1阅读 713评论 0 0
  • 以下这些面试题是我对着多线程的知识点自己一点点总结下来的,如果有不全的地方欢迎大家留言一起探讨。 多线程和并发、并...
    Android小悟空阅读 1,687评论 1 12
  • Java-Review-Note——4.多线程 标签: JavaStudy PS:本来是分开三篇的,后来想想还是整...
    coder_pig阅读 1,629评论 2 17