package com.multithread;
import java.util.HashMap;
import java.util.Map;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.Semaphore;
/**
* created on 7/26/2018
* Used for if one playground has 5 track, we have several students, how to handle
*/
public class TestSemphore {
private static Playground playgroud = new Playground();
public static void main(String[] args)throws InterruptedException {
ExecutorService service = Executors.newCachedThreadPool();
for (int i = 0 ; i < 200; i ++) {
Playground.Track track = playgroud.getTrack();
service.submit(new Student("name" + i));
playgroud.releaseTrack(track);
}
}
static class Student implements Runnable {
private String name;
public Student(String name) {
this.name = name;
}
@Override
public void run() {
System.out.println("student " + name + " is running");
}
}
}
class Playground {
private Map<Track, Boolean> trackMap = new HashMap<>();
private Semaphore semphore = new Semaphore(5, true);
private void initPlayground () {
for (int i =0 ; i < 5; i ++){
trackMap.put(new Track(i), false);
}
}
public Playground() {
initPlayground();
}
public Track getTrack() throws InterruptedException {
semphore.tryAcquire();
for (Map.Entry<Track, Boolean> entry : trackMap.entrySet()) {
Track track = entry.getKey();
Boolean used = entry.getValue();
if(!used) {
entry.setValue(true);
return track;
}
}
return null;
}
public void releaseTrack(Track track) {
trackMap.put(track, false);
semphore.release();
}
class Track{
int num;
public Track(int num) {
this.num= num;
}
@Override
public String toString() {
return "Track{" +
"num=" + num +
'}';
}
}
}
该博客探讨了一个使用Java并发工具Semaphore实现的操场跑道问题。通过创建一个信号量来限制同时运行的学生数量(例如5个跑道),并用HashMap记录跑道的使用状态,实现了并发控制,确保了资源的有效分配和释放。示例代码展示了如何创建线程池,提交任务并在学生完成跑步后释放跑道。
557

被折叠的 条评论
为什么被折叠?



