초보 자 는 다 중 스 레 드 의 상세 한 사고 와 절 차 를 배운다.
제목: 세 개의 스 레 드 를 만 들 고 A 스 레 드 는 10 번 A 를 인쇄 하 며 B 스 레 드 는 10 번 B 를 인쇄 하고 C 스 레 드 는 10 번 C 를 인쇄 하 며 스 레 드 를 동시에 실행 하고 ABC 를 10 번 교체 인쇄 하도록 요구 합 니 다.
1. 세 개의 스 레 드 를 보고 동시에 실행 하고 인쇄 를 교체 하 며 대신 이 쓴 각종 절차, sleep, synchronized, wait, notify 와 머리 가 아 픕 니 다.아니면 스스로 천천히 하 세 요. A 10 개 를 먼저 인쇄 하 세 요.
package main;
/**
*
*
* @author
* @version 2015 11 20 10:46:53
*
*/
public class ManyThreadPrint implements Runnable {
public String name;
public ManyThreadPrint(String name){
this.name=name;
}
@Override
public void run() {
int count = 10;
while(count > 0){
System.out.print(name);
count--;
}
}
public static void main(String[] args) {
ManyThreadPrint mtpa = new ManyThreadPrint("A");
new Thread(mtpa).start();
}
}
해석: Runnable 인 터 페 이 스 를 실현 하 는 방식 으로 스 레 드 를 사용 합 니 다. main 방법 에 인 스 턴 스 를 추가 하여 구조 기 인삼 A 를 사용 하고 run () 방법 을 다시 쓰 는 중 10 회 반복 인쇄 합 니 다.
실행 결 과 는 다음 과 같 습 니 다.
AAAAAAAAAA
2. 10 회 A 인쇄 완료, 하하, B 와 C 를 아래 에 인쇄 해 보 세 요
package main;
/**
*
*
* @author
* @version 2015 11 20 10:46:53
*
*/
public class ManyThreadPrint implements Runnable {
public String name;
public ManyThreadPrint(String name){
this.name=name;
}
@Override
public void run() {
int count = 10;
while(count > 0){
System.out.print(name);
count--;
}
}
public static void main(String[] args) {
ManyThreadPrint mtpa = new ManyThreadPrint("A");
ManyThreadPrint mtpb = new ManyThreadPrint("B");
ManyThreadPrint mtpc = new ManyThreadPrint("C");
new Thread(mtpa).start();
new Thread(mtpb).start();
new Thread(mtpc).start();
}
}
해석: main 방법 에 두 개의 인 스 턴 스 를 추가 하여 B 와 C 를 입 히 고 두 개의 스 레 드 를 추가 하여 실행 합 니 다.
실행 결 과 는 다음 과 같 습 니 다.
AAAAAAAAAABBBBBBBBBBCCCCCCCCCC
비천 하 다.
AAAAAAAAAACCCCCCCCCCBBBBBBBBBB
어떻게 된 거 야?다시 시도 해 보 세 요:
ABBBBBBBBBBAAAAAAAAACCCCCCCCCC
좋 습 니 다. 결 과 는 A 10 개, B 10 개, C 10 개 를 모두 인쇄 했 지만 결과 가 고정 되 지 않 았 습 니 다.
3. 자 료 를 찾 아 보 니 3 개의 라인 이 동시에 실행 되 고 순서 가 고정 되 지 않 았 다.어 쩔 수 없 이 뒤의 스 레 드 를 잠시 기 다 렸 다가 실행 하 게 합 니 다.
package main;
/**
*
*
* @author
* @version 2015 11 20 10:46:53
*
*/
public class ManyThreadPrint implements Runnable {
public String name;
public ManyThreadPrint(String name){
this.name=name;
}
@Override
public void run() {
int count = 10;
while(count > 0){
System.out.print(name);
count--;
}
}
public static void main(String[] args) throws InterruptedException {
ManyThreadPrint mtpa = new ManyThreadPrint("A");
ManyThreadPrint mtpb = new ManyThreadPrint("B");
ManyThreadPrint mtpc = new ManyThreadPrint("C");
new Thread(mtpa).start();
Thread.sleep(10);
new Thread(mtpb).start();
Thread.sleep(10);
new Thread(mtpc).start();
Thread.sleep(10);
}
}
해석: 주의 할 점 이 있 습 니 다. Thread. sleep (10);다음 스 레 드 가 시 작 될 때 까지 기 다 려 야 하 는 시간 입 니 다. 마지막 결 과 는 교체 인쇄 가 필요 하기 때문에 세 번 째 스 레 드 가 실 행 된 후에 도 대기 가 있 습 니 다. 다음 라운드 의 첫 번 째 스 레 드 대기 에 해당 합 니 다.
결 과 는 다음 과 같다.
AAAAAAAAAABBBBBBBBBBCCCCCCCCCC
3. 다음은 ABC 를 교체 하여 대신 의 방법 에 따라 3 개의 대상 을 만 드 는 것 입 니 다. 세 개의 일반적인 Object 이지 만 run () 에서 동기 화, 대기, 자 물 쇠 를 풀 어 스 레 드 의 실행 순 서 를 실현 하고 코드 를 먼저 보 겠 습 니 다.
package main;
/**
*
*
* @author
* @version 2015 11 20 10:46:53
*
*/
public class ManyThreadPrint implements Runnable {
public String name;
public Object prev;
public Object self;
public ManyThreadPrint(String name, Object prev, Object self) {
this.name = name;
this.prev = prev;
this.self = self;
}
@Override
public void run() {
int count = 10;
while(count > 0){
synchronized (prev) {
synchronized (self) {
System.out.print(name);
count--;
self.notify();
}
try {
prev.wait();
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
}
public static void main(String[] args) throws InterruptedException {
Object a = new Object();
Object b = new Object();
Object c = new Object();
ManyThreadPrint mtpa = new ManyThreadPrint("A",c,a);
ManyThreadPrint mtpb = new ManyThreadPrint("B",a,b);
ManyThreadPrint mtpc = new ManyThreadPrint("C",b,c);
new Thread(mtpa).start();
Thread.sleep(10);
new Thread(mtpb).start();
Thread.sleep(10);
new Thread(mtpc).start();
Thread.sleep(10);
}
}
해석:
구조 기 를 바 꿉 니 다. 매번 인 스 턴 스 를 만 들 때마다 인쇄 된 문자열 을 제외 하고 두 개의 대상 이 있 습 니 다. 이 두 대상 은 일반적인 Object 일 뿐 스 레 드 와 털실 관계 가 없 으 며 스 레 드 를 통 해 대상 잠 금 작업 을 통 해 절 차 를 제어 합 니 다.핵심 코드 는 run () 의 순환 에서 조금씩 옵 니 다.
여기 synchronized (self), synchronized (prev), self 현재 대상 잠 금, prev 이전 (접두사) 대상 잠 금, 스 레 드 가 두 대상 잠 금 을 가 져 올 때 인쇄 를 실행 합 니 다.주의 가 필요 하 다.동기 화 됨 (self) 을 동기 화 됨 (prev) 에 서 는 인쇄 A 스 레 드 가 실 행 된 후 선행 C 대상 을 기다 리 는 스 레 드 탱크 에 들 어가 C 를 인쇄 할 때 C 대상 을 깨 우 면 인쇄 C 가 완료 되면 바로 A 를 인쇄 합 니 다. 그러나 이렇게 실행 하려 면 3 개의 스 레 드 의 시작 순 서 를 확보 해 야 합 니 다. 즉, main 방법의 Thread. sleep (10) 입 니 다.인쇄 A 스 레 드 를 시작 할 때 A 를 인쇄 하고 자신 을 깨 우 며 C 를 기다 리 는 스 레 드 탱크 에 들 어가 AC 를 방출 합 니 다.3 개의 스 레 드 가 시작 순서에 따라 완 료 될 때, 즉 C 스 레 드 를 인쇄 한 후에 바로 A 를 인쇄 하고 A 스 레 드 를 인쇄 한 후에 바로 B 를 인쇄 하여 순서대로 순환 합 니 다.
즉, 3 개의 스 레 드 가 시 작 된 후에 인쇄 A 의 스 레 드 를 C 대상 을 기다 리 는 스 레 드 풀 에 들 어간 것 이다.인쇄 B 의 스 레 드 를 A 대상 을 기다 리 는 스 레 드 탱크 에 들 어가 기;인쇄 C 의 스 레 드 를 B 대상 을 기다 리 는 스 레 드 탱크 에 넣 습 니 다.이 때 A 스 레 드 를 인쇄 하고 B 스 레 드 를 인쇄 하 며 C 스 레 드 를 인쇄 하 는 순서 로 실행 하면 다음 라운드 가 A 스 레 드 를 인쇄 하 는 것 으로 시작 하여 나중에 인쇄 순 서 를 확보 합 니 다.
자신 이 코드 를 치 는 과정 에서 알 아 볼 때 발견 하지 못 한 것 을 많이 발 견 했 기 때문에 배 우 는 것 은 스스로 한 번 때 리 는 것 이 좋다.
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
다양한 언어의 JSONJSON은 Javascript 표기법을 사용하여 데이터 구조를 레이아웃하는 데이터 형식입니다. 그러나 Javascript가 코드에서 이러한 구조를 나타낼 수 있는 유일한 언어는 아닙니다. 저는 일반적으로 '객체'{}...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.