자바 다 중 스 레 드 도구 클래스
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();
}
}
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
JPA + QueryDSL 계층형 댓글, 대댓글 구현(2)이번엔 전편에 이어서 계층형 댓글, 대댓글을 다시 리팩토링해볼 예정이다. 이전 게시글에서는 계층형 댓글, 대댓글을 구현은 되었지만 N+1 문제가 있었다. 이번에는 그 N+1 문제를 해결해 볼 것이다. 위의 로직은 이...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.