这是我参与11月更文挑战的第7天,活动详情查看:2021最后一次更文挑战
一、多线程简介
- 基本的 概念 是同时对多个任务加以控制,就是同时执行多个任务,通过提高资源使用效率来提高系统的效率。
- 多线程 目的 :最大限度地利用CPU资源。
- 多线程 优点 :1.资源利用率更好。 2. 程序设计在某些情况下更简单。 3.程序响应更快。
- 线程执行过程(图源于网络)
二、实例解决方案解析(交替打印FooBar)
Question: 提供一个类如下,两个不同的线程将会共用一个 FooBar 实例。其中一个线程将会调用 foo() 方法,另一个线程将会调用 bar() 方法。请设计修改程序,以确保 “foobar” 被输出 n 次。
1 | csharp复制代码class FooBar { |
1、使用 BlockingQueue
- BlockingQueue (阻塞队列) : 一个支持两个附加操作的队列。一个线程生产对象,而另外一个线程消费这些对象。
- 1、在队列为空时,获取元素的线程会等待队列变为非空。
- 2、当队列满时,存储元素的线程会等待队列可用。
- 应用场景:阻塞队列常用于生产者和消费者的场景,生产者是往队列里添加元素的线程,消费者是从队列里拿元素的线程。阻塞队列就是生产者存放元素的容器,而消费者也只从容器里拿元素。一个线程将会持续生产新对象并将其插入到队列之中,直到队列达到它所能容纳的临界点。也就是说,它是有限的。如果该阻塞队列到达了其临界点,负责生产的线程将会在往里边插入新对象时发生阻塞。它会一直处于阻塞之中,直到负责消费的线程从队列中拿走一个对象。
- 题解以及注释:
1 | java复制代码public class FooBar { |
2、使用 Thread.yield() (自旋 + 让出CPU)
- Thread.yield() 方法作用:暂停当前正在执行的线程对象,并执行其他线程(可以这么理解)。而 Thread.yield() 真正的作用是让当前正在运行的线程回到可运行状态,以允许具有相同优先级的其他线程获得运行的机会,如下图(源于网络)。
- 题解以及注释:
1 | ini复制代码class FooBar { |
三、参考:
本文转载自: 掘金