자바 다 중 스 레 드 Semaphore CountDownlatch ScheduledExecutorService
[java. util. concurrent 에 대해 모 르 시 는 5 가지, 2 부]
1,Semaphore
적용: 처리 되 지 않 은 특정 자원 요청 (스 레 드 / 작업) 수량 을 제한 합 니 다.
public class SemApp {
public static void main(String[] args) {
Runnable limitedCall = new Runnable() {
final Random rand = new Random();
final Semaphore available = new Semaphore(3);
int count = 0;
public void run() {
int time = rand.nextInt(15);
int num = count++;
try {
available.acquire();
System.out.println("Executing " +
"long-running action for " +
time + " seconds... #" + num);
Thread.sleep(time * 1000);
System.out.println("Done with #" +
num + "!");
available.release();
} catch (InterruptedException intEx) {
intEx.printStackTrace();
}
}
};
for (int i=0; i<10; i++)
new Thread(limitedCall).start();
}
}
프로그램 에서 동시에 열 리 는 작업 수 를 제한 하 는 것 이 세 개 입 니 다.
결과 적
Executing long-running action for 9 seconds... #0
Executing long-running action for 7 seconds... #2
Executing long-running action for 0 seconds... #1
Done with #1!
Executing long-running action for 1 seconds... #3
Done with #3!
Executing long-running action for 6 seconds... #4
Done with #2!
Executing long-running action for 5 seconds... #5
Done with #4!
Executing long-running action for 6 seconds... #6
Done with #0!
Executing long-running action for 12 seconds... #7
Done with #5!
Executing long-running action for 1 seconds... #8
Done with #8!
Executing long-running action for 12 seconds... #9
Done with #6!
Done with #7!
Done with #9!
특정 자원 과 스 레 드 접근 수 에 대한 한정 Semaphore 는 좋 은 선택 입 니 다.여 기 는 Semaphore 를 사용 하여 한 번 에 하나의 통행증 을 사용 하고 방출 했 으 며, Semaphore 는 한 번 에 여러 개의 통행증 을 사용 하고 방출 할 수 있다.
2,CountDownLatch
public class CDLApp {
public static void main(String[] args)
throws InterruptedException, java.io.IOException {
System.out.println("Prepping...");
Race r = new Race(
"horse 1", "horse 2", "horse 3", "horse 4",
"horse 5", "horse 6", "horse 7", "horse 8"
);
System.out.println("It's a race of " + r.getDistance() + " lengths");
System.out.println("Press Enter to run the race....");
System.in.read();
r.run();
}
}
class Race {
private Random rand = new Random();
private int distance = rand.nextInt(250);
private List<String> horses = new ArrayList<String>();
public Race(String... names) {
this.horses.addAll(Arrays.asList(names));
}
public int getDistance() {return distance;}
public void run() throws InterruptedException {
System.out.println("And the horses are stepping up to the gate...");
final CountDownLatch start = new CountDownLatch(1);
final CountDownLatch finish = new CountDownLatch(horses.size());
final List<String> places =
Collections.synchronizedList(new ArrayList<String>());
for (final String h : horses) {
new Thread(new Runnable() {
public void run() {
try {
start.await();//
System.out.println(h +
" stepping up to the gate...");
int traveled = 0;
while (traveled < distance) {
// 0-2
Thread.sleep(rand.nextInt(3) * 1000);
// 0-14
traveled += rand.nextInt(15);
System.out.println(h +
" advanced to " + traveled + "!");
}
System.out.println(h +
" crossed the finish!");
places.add(h);
finish.countDown();// ,
}
catch (InterruptedException intEx) {
System.out.println("ABORTING RACE!!!");
intEx.printStackTrace();
}
}
}).start();
}
System.out.println("And... they're off!");
start.countDown();//
finish.await();//
System.out.println("============================================");
System.out.println("And we have our winners!");
System.out.println("<"+places.get(0)+">" + " took the gold...");
System.out.println("<"+places.get(1)+">" + " got the silver...");
System.out.println("and " + "<"+places.get(2)+">" + " took home the bronze.");
System.out.println("============================================");
}
}
위의 프로그램 은 Count Downlatch 를 이용 하여 경주 마 의 과정 을 설명 합 니 다. 먼저 모든 말 을 빗장 (start. countDown (), / / 경주 마 시작) 에서 시작 을 기다 리 게 합 니 다. 말 한 마리 가 결승점 을 통과 한 후 (finish. countDown), finish. awat () 는 모든 말 이 결승점 을 통과 하 기 를 기다 린 후에 메달 을 수여 합 니 다.
3,ScheduledExecutorService
public class Ping {
public static void main(String[] args) {
ScheduledExecutorService ses =
Executors.newScheduledThreadPool(1);
Runnable pinger = new Runnable() {
public void run() {
System.out.println("PING!");
}
};
ses.scheduleAtFixedRate(pinger, 1, 2, TimeUnit.SECONDS);
}
}
시 뮬 레이 션 심장 은 2 초 에 한 번 씩 뛴다.참고 로 사용자 가 심장 박동 을 취소 하 기 를 원한 다 면
scheduleAtFixedRate
호출 은 결과 (있 으 면) 뿐만 아니 라 ScheduledFuture
방법 으로 계획 을 닫 는 작업 도 할 수 있 습 니 다.이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
Is Eclipse IDE dying?In 2014 the Eclipse IDE is the leading development environment for Java with a market share of approximately 65%. but ac...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.