자바 다 중 스 레 드 Semaphore CountDownlatch ScheduledExecutorService

참고: http://www.ibm.com/developerworks/cn/java/j-5things5.html
[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 방법 으로 계획 을 닫 는 작업 도 할 수 있 습 니 다.

좋은 웹페이지 즐겨찾기