자바 다 중 스 레 드 도구 클래스

6045 단어 Java스 레 드
1.CountDownlatch
CountDownlatch 는 카운트다운 에 사용 할 수 있 습 니 다.
getCount():현재 계수기 의 남 은 계 수 를 가 져 옵 니 다.
countDown():카운터 한 번 사용 하기
await():다 중 스 레 드 가 실 행 된 뒤에 사용 합 니 다.CountDownlatch 카운터 가 모두 풀 리 고 getCount()==0 일 때 만 깨 워 서 계속 실행 합 니 다.
public class Test {

	public static void main(String[] args) throws InterruptedException {

		ExecutorService es = Executors.newFixedThreadPool(10);
		CountDownLatch latch = new CountDownLatch(5);
		while(latch.getCount() > 0) {
		//for(int i = 0; i < 2; i++) {
			es.execute(new Runnable() {
				@Override
				public void run() {
					System.out.println(Thread.currentThread().getName());
				}
			});
			latch.countDown();
		}
		latch.await();
		es.shutdown();
	}

}

2.CyclicBarrier
순환 실행 에 사용 합 니 다.지정 한 개수 의 스 레 드 가 await()를 실행 한 후에 만 깨 울 수 있 습 니 다.
await():run 에서 await 가 지정 한 수 에 도달 한 후에 야 깨 웁 니 다.
await(long timeout,TimeUnit unit):시간 초과 설정 가능,시간 초과 후 지정 한 await()수량 에 도달 하지 않 으 면 시간 초과 이상 던 지기
한 가지:await()가 지정 한 수량 에 이 르 지 못 하면 스 레 드 가 계속 기다 릴 수 있 습 니 다.이 때 스 레 드 점용 을 해제 하지 않 습 니 다.
public class Test08 {

	public static void main(String[] args) throws InterruptedException {

		ExecutorService es = Executors.newFixedThreadPool(3);
		CyclicBarrier cb = new CyclicBarrier(3);
		es.execute(new Runnable() {
			@Override
			public void run() {
				try {
					System.out.println("wait 【1】");
					System.out.println(Thread.currentThread().getName());
					cb.await();
					System.out.println(1);
				} catch (InterruptedException | BrokenBarrierException e) {
					e.printStackTrace();
				}
			}
		});
		es.execute(new Runnable() {
			@Override
			public void run() {
				try {
					System.out.println("wait 【2】");
					System.out.println(Thread.currentThread().getName());
					cb.await();
					System.out.println(2);
				} catch (InterruptedException | BrokenBarrierException e) {
					e.printStackTrace();
				}
			}
		});
		es.execute(new Runnable() {
			@Override
			public void run() {
				try {
					System.out.println("wait 【3】");
					System.out.println(Thread.currentThread().getName());
					cb.await();
					System.out.println(3);
				} catch (InterruptedException | BrokenBarrierException e) {
					e.printStackTrace();
				}
			}
		});
		es.execute(new Runnable() {
			@Override
			public void run() {
				try {
					System.out.println("wait 【4】");
					System.out.println(Thread.currentThread().getName());
					cb.await();
					System.out.println(4);
				} catch (InterruptedException | BrokenBarrierException e) {
					e.printStackTrace();
				}
			}
		});
		es.execute(new Runnable() {
			@Override
			public void run() {
				try {
					System.out.println("wait 【5】");
					System.out.println(Thread.currentThread().getName());
					cb.await();
					System.out.println(5);
				} catch (InterruptedException | BrokenBarrierException e) {
					e.printStackTrace();
				}
			}
		});

		for (int i = 0; i < 10; i++) {
			es.execute(new Runnable() {
				@Override
				public void run() {
					//    4 5        ,               
					System.out.println(Thread.currentThread().getName());
				}
			});
		}
		System.out.println("43412432432432");
		es.shutdown();
	}
}

3.Semaphore
Semaphore(int permits):permits 허가 수량
Semaphore(int permits,boolean fair):fair 공평 여부
acquire():허가증 획득-현재 허가 가 없 으 면 대기 차단
acquire(int permits):permits 허가 수량
release():허가증 석방-석방 전에 먼저 얻 은 허가증,차단 이 필요 합 니 다.
release(int permits):permits 허가 수량
한 가지:지 정 된 수량의 허가증 이 모두 점용 되면 막 히 고 막 히 지 않 으 면 사용 할 수 있 습 니 다. try Acquire()방법
public class Test08 {

	public static void main(String[] args) throws InterruptedException {

		ExecutorService es = Executors.newFixedThreadPool(5);
		Semaphore sh = new Semaphore(4);
		for (int i = 0; i < 10; i++) {
			es.execute(new Work(i, sh));
		}

		es.shutdown();
	}
}

class Work implements Runnable {
	private int worker;
	private Semaphore semaphore;

	public Work(int worker, Semaphore semaphore) {
		this.worker = worker;
		this.semaphore = semaphore;
	}

	@Override
	public void run() {
		try {
			semaphore.acquire(1);
			System.out.println("       【" + worker + "】" + "     ");
			semaphore.release(1);
			System.out.println("       【" + worker + "】" + "   ");
		} catch (InterruptedException e) {
			e.printStackTrace();
		}
	}

}

4.교환
두 라인 사이 의 데이터 교환 을 진행 하 다
exchange():교환 방법의 스 레 드 를 단수 로 호출 하면 스 레 드 가 기다 리 고 스 레 드 를 막 습 니 다.
public class Test08 {

	public static void main(String[] args) throws InterruptedException {

		ExecutorService es = Executors.newFixedThreadPool(5);
		Exchanger change = new Exchanger<>();
		es.execute(new Runnable() {
			@Override
			public void run() {
				try {
					String s1 = "1";
					System.out.println(s1);
					String s2 = change.exchange(s1);
					System.out.println(s1 + " - " +s2);
				} catch (InterruptedException e) {
					e.printStackTrace();
				}
			}
		});
		es.execute(new Runnable() {
			@Override
			public void run() {
				try {
					String s1 = "2";
					System.out.println(s1);
					String s2 = change.exchange(s1);
					System.out.println(s1 + " - " +s2);
				} catch (InterruptedException e) {
					e.printStackTrace();
				}
			}
		});
		es.execute(new Runnable() {
			@Override
			public void run() {
				try {
					String s1 = "3";
					System.out.println(s1);
					String s2 = change.exchange(s1);
					System.out.println(s1 + " - " +s2);
				} catch (InterruptedException e) {
					e.printStackTrace();
				}
			}
		});
		es.execute(new Runnable() {
			@Override
			public void run() {
				try {
					String s1 = "4";
					System.out.println(s1);
					String s2 = change.exchange(s1);
					System.out.println(s1 + " - " +s2);
				} catch (InterruptedException e) {
					e.printStackTrace();
				}
			}
		});
		
		es.shutdown();
	}
}

좋은 웹페이지 즐겨찾기