抱歉,您的瀏覽器無法訪問本站
本頁面需要瀏覽器支持(啟用)JavaScript
了解詳情 >

三个线程顺序执行依次输出ABCABCABCABC…

题目描述

三个线程顺序执行依次输出ABCABCABCABC…,让我们如何控制线程的同步访问,使得线程依次输出ABCABCABCABC…的结果。

解题思路

使用最简便最实用的信号量Semaphore,通过控制信号的获取以及释放,承接获取锁来实现线程得顺序执行以及临界资源的同步访问。这里要明白如果信号量(Semaphore)初始化为0的话,调用acquire()就会堵塞,直到调用relase()。

代码实例

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
package com.czj.interview;

import java.util.concurrent.Semaphore;

/**
* 创建在 2020/6/7 17:06
*/
public class SemaphoreABC {

public static void main(String[] args) {
Semaphore semaphoreA = new Semaphore(1);
Semaphore semaphoreB = new Semaphore(0);
Semaphore semaphoreC = new Semaphore(0);
new Thread(()->print("A",semaphoreA,semaphoreB)).start();
new Thread(()->print("B",semaphoreB,semaphoreC)).start();
new Thread(()->print("C",semaphoreC,semaphoreA)).start();
}
public static void print(String word, Semaphore start, Semaphore end){
for (int i=0;i<5;i++){
try {
start.acquire();
System.out.println(word);
end.release();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}

线程和进程的区别

  • 进程是程序运行和资源分配的基本单位,一个程序至少有一个进程,一个进程至少有一个线程。
  • 进程在执行过程中拥有独立的内存单元,而多个线程共享内存资源,减少切换次数,从而效率更高。
  • 线程是进程的一个实体,是cpu调度和分派的基本单位,是比程序更小的能独立运行的基本单位。同一进程中的多个线程之间可以并发执行。

创建线程有哪几种方式

  1. 实现Runnable接口
  2. 通过Callable和Future创建线程
  3. 继承Thread类

死锁是什么,怎么防止死锁

死锁是指两个或两个以上的进程在执行过程中,因争夺资源而造成的一种互相等待的现象,若无外力作用,它们都将无法推进下去。

死锁的四个必要条件

  • 互斥条件:一个资源每次只能被一个线程使用
  • 请求和保持条件:一个线程因请求资源而阻塞时,对已获得的资源保持不放
  • 不可剥夺条件:线程已获得的资源,在末使用完之前,不能强行剥夺
  • 环路等待条件:若干线程之间形成一种头尾相接的循环等待资源关系

为什么阿里开发手册说线程池不允许使用Executors去创建

  • FixedThreadPool和SingleThreadPool:允许的请求队列长度为Integer.MAX_VALUE,可能会堆积大量的请求,从而导致OOM。
  • CachedThreadPool:允许的创建线程数量为Integer.MAX_VALUE,可能会创建大量的线程,从而导致OOM。