多线程方面
1、信号量
Semaphore可以维护当前访问自身的线程个数,并提供了同步机制。使用他可以控制同时访问资
源的线程个数。
package com.demo.thread;
import java.util.concurrent.Semaphore;
/**
* 题目描述:有三个线程名字分别是A、B、C,每个线程只能打印自己的名字,在
* 屏幕上顺序打印 ABC,打印10次。不准使用线程的sleep()
*
* @author DAL.feng
*/
public class OrderPrintByObj extends Thread {
private Semaphore curr;
private Semaphore next;
public OrderPrintByObj(String name, Semaphore curr, Semaphore next) {
super(name);
this.curr = curr;
this.next = next;
}
public void run() {
// 设置循环总次数
int total = 10;
for(int index=0; index<total; index++) {
try {
/*
* 申请许可
* 这里通过初始化信号量实例时设置信号量允许的线程数,
* 来控制3个线程启动时,A先打印,B、C都处于等待状态
*/
curr.acquire();
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
// 打印当前线程名称,用来标记3个线程是顺序打印的
System.out.println(getName());
// 释放下个目标线程绑定的信号量的许可
next.release();
}
}
public static void main(String[] args) {
/*
* 初始化信号量实例,共初始化3个实例,分别绑定线程a、b、c(这3个线程要访问同一个共享资源,设置信号量才有意义);
* 绑定线程a的信号量,其许可为1,其余均为0,
* 意味着3个线程启动后,只有a线程才能申请到许可,解决a先打印的问题;
* 同时,b、c线程信号量都为0,线程启动后由于申请不到许可,会处于等待状态,
* 只有上一个线程工作之后,主动释放下个线程对应的许可才行;
*/
Semaphore sa = new Semaphore(1);
Semaphore sb = new Semaphore(0);
Semaphore sc = new Semaphore(0);
OrderPrintByObj a = new OrderPrintByObj("A", sa, sb);
OrderPrintByObj b = new OrderPrintByObj("B", sb, sc);
OrderPrintByObj c = new OrderPrintByObj("C", sc, sa);
a.start();
b.start();
c.start();
}
}