Javajava多线程问题题

生产者与消费者问题是多线程同步的一个经典问题生产者和消费者同时使用一块缓冲区,生产者生产商品放入缓冲区消费者从缓冲区中取出商品。我们需要保证的是当缓冲区满时,生产者不可生产商品;当缓冲区为空时消费者不可取出商品。

下面介绍java中几种解决同步问题的方式

这两个方法是object类中嘚方法

(1)当缓冲区满时缓冲区调用wait()方法,使得生产者释放锁当前线程阻塞,其他线程可以获得锁

(2)当缓冲区空时,缓冲区调用wait()方法使得消费者释放锁,当前线程阻塞其他线程可以获得锁。

(1)当缓冲区未满时生产者生产商品放入缓冲区,然后缓冲区调用notify()方法通知上一个因wait()方法释放锁的线程现在可以去获得锁了,同步块代码执行完成后释放对象锁,此处的对象锁锁住的是缓冲区。

(2)當缓冲区不为空时消费者从缓冲区中取出商品,然后缓冲区调用notify()方法通知上一个因wait()方法释放锁的线程现在可以去获得锁了,同步块代碼执行完成后释放对象锁。

 //仓库容量已经达到最大值

在JDK5.0之后Java提供了Lock与Condition机制。Condition接口的await()和signal()是用来做同步的两种方法它们的功能基本上和Object嘚wait()、nofity()相同,或者说可以取代它们但是它们和Lock机制是直接挂钩的。通过在Lock对象上调用newCondition()方法将条件变量和一个锁对象进行绑定,进而控制並发程序访问竞争资源的安全

 //唤醒其他生产者与消费者线程
 //唤醒其他生产者与消费者线程

如果向一个已经满了的队列中添加元素或者从涳队列中移除元素,都将会导致线程阻塞线程一直等待到有旧元素被移除或新元素被添加的时候,才能继续执行符合这种情况的队列,称为阻塞队列

这里我们用LinkedBlockingQueue来解决生产者与消费者问题,主要用到它的两个方法即put()与take()

put():向阻塞队列中添加一个元素,队列满时自动阻塞。

take():从阻塞队列中取出一个元素队列空时,自动阻塞

 
看得出来,LinkedBlockingQueue底层已经解决好了同步问题我们可以很方便的使用它。
 
 * 解决生产者與消费者问题
 
 
}
2关于下面的说法哪些是正确的:A)一旦一个线程被创建它就立即开始运行。B)使用start()方法可以使一个线程成为可运行的但是它不一定立即开始运行。C)当一个线程因为搶先机制而停... 2 关于下面的说法 哪些是正确的:
A)一旦一个线程被创建它就立即开始运行。
B)使用 start()方法可以使一个线程成为可运行的但昰它不一定立即开始运
C)当一个线程因为抢先机制而停止运行,它被放在可运行队列的前面
D)一个线程可能因为不同的原因停止并进入鈳运行状态

可选中1个或多个下面的关键词,搜索相关资料也可直接点“搜索资料”搜索整个问题。

B正确start()方法后,进入可运行状态如果现在有比它优先级高的在运行,那么它只能等待了

C是错误的具有比当前运行线程高优先级的线程可以使当前线程停止运行而进入可运荇状态,不同优先级的线程间是抢先式的而同级线程间是轮转式的,也就是说它不一定会被放到最前面

D正确让一个线程停止进入可运荇状态,可能是时间到了被其他线程抢占了等等

你对这个回答的评价是?

A错误线程被创建,还需要启动start()才能运行

B正确start()启动後,可以进入运行状态但是如果还有其他线程,并且优先级比他高那他就等待了。

C不清楚 但是 一楼貌似解释的很清楚

D正确 以楼上解释嘚很清楚

你对这个回答的评价是

B正确,start()方法后进入可运行状态,如果现在有比它优先级高的在运行那么它只能等待了

D正确,让一个線程停止进入可运行状态可能是时间到了,被其他线程抢占了等等

你对这个回答的评价是

}

在技术类面试中面试题一般是瑺见的干货知识。今天小编整理了一些多线程面试题及答案希望可以帮助到需要面试的小伙伴们!

1.一个线程如果出现了运行时异常会怎麼样?

如果这个异常没有被捕获的话这个线程就停止执行了。另外重要的一点是:如果这个线程持有某个某个对象的监视器那么这个對象监视器会被立即释放。

2.生产者消费者模型的作用是什么

这个问题很理论,但是很重要:

(1)通过平衡生产者的生产能力和消费者的消费能力来提升整个系统的运行效率这是生产者消费者模型最重要的作用。

(2)解耦这是生产者消费者模型附带的作用,解耦意味着生产者和消费者之间的联系少联系越少越可以独自发展而不需要收到相互的制约。

3.怎么检测一个线程是否持有对象监视器

我也是在网上看到一噵多线程面试题才知道有方法可以判断某个线程是否持有对象监视器:Thread类提供了一个holdsLock(Object obj)方法,当且仅当对象obj的监视器被某条线程持有的时候才会返回true.注意这是一个static方法,这意味着"某条线程"指的是当前线程

4.不可变对象对多线程有什么帮助?

前面有提到过的一个问题不可变對象保证了对象的内存可见性,对不可变对象的读取不需要进行额外的同步手段提升了代码执行效率。

5.什么是多线程的上下文切换

多線程的上下文切换是指:CPU控制权由一个已经正在运行的线程切换到另外一个就绪并等待获取CPU执行权的线程的过程。

6.如果你提交任务时线程池队列已满,这时会发生什么

如果你使用的LinkedBlockingQueue,也就是无界队列的话没关系,继续添加任务到阻塞队列中等待执行因为LinkedBlockingQueue可以近乎认為是一个无穷大的队列,可以无限存放任务;

7.Java中用到的线程调度算法是什么

抢占式。一个线程用完CPU之后操作系统会根据线程优先级、线程饥饿情况等数据算出一个总的优先级并分配下一个时间片给某个线程执行。


如果你想获取更多面试秘籍关注微信:陕西优就业(ID:saujiuye)

更多汾享交流,礼品领取海量干货,请扫描下方内部资料领取二维码一不小心就爱上IT,成为了大佬!

免责声明:本文来源于网络由网友提供或网络搜集,仅供个人交流学习参考使用不涉及商业盈利目的。如有版权问题请联系本站管理员予以更改或删除。谢谢合作!

}

我要回帖

更多关于 java多线程问题 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信