자바 스 레 드 간 통신 방법 총화
8085 단어 자바스 레 드커 뮤 니 케 이 션
동시 프로 그래 밍 에서 우 리 는 이런 장면 을 만 날 수 있다.
A,B 두 라인 이 병행 되 지만,나 는 B 라인 이 A 라인 이 실 행 된 후에 다시 실행 되 기 를 희망 한다
이 럴 때 는 스 레 드 간 통신 이 필요 하 다.
A.집행 이 끝 난 후에 B 에 게'여보세요,B,저 는 집행 이 끝 났 습 니 다.'라 고 말 했다.
자,강 강 강 이 자바 로 어떻게 이 루어 지 는 지.
1.synchronized 기반
2.reentrentLock 기반
3.volatile 기반
4.countDownlatch 기반
나 는 지금 이 네 가 지 를 알 고 있다.
1.synchronized+wait()와 notify()
wait()와 notify()는 모두 Object 류 의 통신 방법 입 니 다.주의 하 세 요.wait 와 notify 는 synchronized 와 함께 사용 해 야 합 니 다.또한 wait()는 자 물 쇠 를 풀 고 notify()는 자 물 쇠 를 풀 지 않 습 니 다.
public class SynchronizedTest {
// year,
private static double year;
public void run() {
// A, rap
Thread threadA = new Thread(() -> {
synchronized (this) {
for (year = 0.5; year <= 5; year += 0.5) {
System.out.println(" rap: " + year + " ");
try {
Thread.sleep(288);
} catch (InterruptedException e) {
e.printStackTrace();
}
// ,
if (year == 2.5) {
System.out.println("===========================> , !!!");
this.notify();
}
}
}
});
// B,
Thread threadB = new Thread(() -> {
while (true) {
synchronized (this) {
try {
this.wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println(" ");
}
}
});
// , B, B
threadB.start();
threadA.start();
}
public static void main(String[] args) {
SynchronizedTest test = new SynchronizedTest();
test.run();
}
}
실행 결과:채 서 계 랩 연습 시작:0.5 년
채 서 계 랩 연습 시작
채 서 계 랩 연습 시작
채 서 계 랩 연습 시작
채 서 계 랩 연습 시작 2.5 년
================================
채 서 계 랩 연습 시작
채 서 계 랩 연습 시작
채 서 계 랩 연습 시작
채 서 계 랩 연습 시작 4.5 년
채 서 계 랩 연습 시작
채 서 계 는 농 구 를 연습 하기 시작 했다.
실행 결 과 를 주의 하 십시오.스 레 드 A 는 notify 를 실행 한 후에 자 물 쇠 를 풀 지 않 고 현재 작업 을 수행 한 후에 스 레 드 B 의 작업 을 시작 합 니 다.
2.ReentrantLock 기반
ReentrantLock 도 스 레 드 간 통신 을 실현 할 수 있 지만 좀 귀 찮 습 니 다.ReentrantLock 의 Condition 과 결합 해 야 합 니 다.
public class LockTest {
// year,
private static double year;
public static void main(String[] args) {
ReentrantLock lock = new ReentrantLock();
Condition condition = lock.newCondition();
// A, rap
Thread threadA = new Thread(() -> {
//
lock.lock();
for (year = 0.5; year <= 5; year += 0.5) {
System.out.println(" rap: " + year + " ");
try {
Thread.sleep(288);
} catch (InterruptedException e) {
e.printStackTrace();
}
// ,
if (year == 2.5) {
System.out.println("===========================> , !!!");
//
condition.signal();
}
}
//
lock.unlock();
});
// B,
Thread threadB = new Thread(() -> {
//
lock.lock();
while (true) {
try {
// , 0 ,
condition.await();
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println(" ");
break;
}
//
lock.unlock();
});
// , B, B
threadB.start();
threadA.start();
}
}
실행 결과:채 서 계 랩 연습 시작:0.5 년
채 서 계 랩 연습 시작
채 서 계 랩 연습 시작
채 서 계 랩 연습 시작
채 서 계 랩 연습 시작 2.5 년
================================
채 서 계 랩 연습 시작
채 서 계 랩 연습 시작
채 서 계 랩 연습 시작
채 서 계 랩 연습 시작 4.5 년
채 서 계 랩 연습 시작
채 서 씨 암탉 이 농 구 를 연습 하기 시작 했다.
효 과 는 synchronized+wait()와 notify()와 같 습 니 다.
3.volatile 기반
공유 변 수 를 사용 해도 실현 할 수 있 습 니 다.volatile 을 사용 하면 됩 니 다.원 리 는 여러 스 레 드 가 같은 변 수 를 공동으로 감청 하고 변수의 값 변화 에 따라 대응 하 는 임 무 를 수행 하 는 것 입 니 다.여기 서 volatile 의 역할 은 다른 스 레 드 가 변수 값 의 변 화 를 즉시 감지 할 수 있 도록 하 는 것 입 니 다.
public class volatileTest {
// , , volatile
static volatile boolean flag = false;
// year,
private static double year;
public static void main(String[] args) {
// A, rap
Thread threadA = new Thread(() -> {
while (true) {
if (!flag) {
for (year = 0.5; year <= 5; year += 0.5) {
System.out.println(" rap: " + year + " ");
try {
Thread.sleep(288);
} catch (InterruptedException e) {
e.printStackTrace();
}
// ,
if (year == 2.5) {
System.out.println("===========================> , !!!");
year = 0.5;
flag = true;
break;
}
}
}
}
});
// B,
Thread threadB = new Thread(() -> {
while (true) {
if (flag) {
System.out.println(" ");
break;
}
}
});
//
threadA.start();
threadB.start();
}
}
실행 결과:채 서 계 랩 연습 시작:0.5 년
채 서 계 랩 연습 시작
채 서 계 랩 연습 시작
채 서 계 랩 연습 시작
채 서 계 랩 연습 시작 2.5 년
================================
채 서 씨 암탉 이 농 구 를 연습 하기 시작 했다.
CountDownlatch 기반
Countdown Latch 는 JUC 패키지 의 병렬 프로 그래 밍 도구 입 니 다.주로 두 가지 방법 이 있 습 니 다.countDown 과 await,Countdown Latch 바 텀 은 계수 기 를 유지 하고 있 습 니 다.예화 할 때 설정 합 니 다.countDown 방법 을 호출 할 때 계수 기 를 하나 줄 이 고 카운터 가 1 을 줄 이기 전에 0 이 되면 아무 일 도 일어나 지 않 습 니 다.1 을 줄 이면 0 이 됩 니 다.기다 리 는 모든 스 레 드 를 깨 웁 니 다.await 방법 은 카운터 가 0 일 때 까지 현재 스 레 드 를 기다 리 게 합 니 다.
public class CountDownLatchTest {
// year,
private static double year;
public static void main(String[] args) {
CountDownLatch latch = new CountDownLatch(1);
// A, rap
Thread threadA = new Thread(() -> {
for (year = 0.5; year <= 5; year += 0.5) {
System.out.println(" rap: " + year + " ");
try {
Thread.sleep(288);
} catch (InterruptedException e) {
e.printStackTrace();
}
// ,
if (year == 2.5) {
System.out.println("===========================> , !!!");
//
latch.countDown();
}
}
});
// B,
Thread threadB = new Thread(() -> {
while (true) {
try {
// , 0 ,
latch.await();
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println(" ");
break;
}
});
//
threadA.start();
threadB.start();
}
}
실행 결과:채 서 계 랩 연습 시작:0.5 년
채 서 계 랩 연습 시작
채 서 계 랩 연습 시작
채 서 계 랩 연습 시작
채 서 계 랩 연습 시작 2.5 년
================================
채 서 계 랩 연습 시작
채 서 씨 암탉 이 농 구 를 연습 하기 시작 했다.
채 서 계 랩 연습 시작
채 서 계 랩 연습 시작
채 서 계 랩 연습 시작 4.5 년
채 서 계 랩 연습 시작
만약 당신 이 몇 번 더 운행 한다 면,당신 은 라인 B 가 실행 하 는 시기 가 무 작위 인 것 을 발견 할 수 있 을 것 이다.그러나 영원히 계수기 가 0 이 된 후에 야 실행 을 시작 할 것 이다.즉,계수기 가 0 이 된 후에 라인 A 와 라인 B 가 자 물 쇠 를 빼 앗 은 사람 이 실행 하 는 것 이다.
글 에서 모든 demo 는 복사 하면 실행 할 수 있 습 니 다.여러분 은 손 을 많이 써 야 합 니 다.집에 조건 이 있 는 것 은 아이디어 로 뛰 어 다 니 고 조건 이 없 는 것 은 손 으로 베 낄 수 있 습 니 다.
총결산
자바 스 레 드 간 통신 에 관 한 이 글 은 여기까지 소개 되 었 습 니 다.더 많은 자바 스 레 드 간 통신 내용 은 우리 의 이전 글 을 검색 하거나 아래 의 관련 글 을 계속 조회 하 시기 바 랍 니 다.앞으로 많은 응원 바 랍 니 다!
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 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에 따라 라이센스가 부여됩니다.