자바 다 중 스 레 드 인삼

4405 단어 다 중 스 레 드
상세 출처 참고:http://www.jb51.net/article/31981.htm
 
        다 중 스 레 드 의 비동기 개발 모델 에서 데이터 의 전달 과 반환 과 동기 개발 모델 은 큰 차이 가 있다.스 레 드 의 운행 과 끝 은 예측 할 수 없 기 때문에 데 이 터 를 전달 하고 되 돌 릴 때 함수 처럼 함수 파라미터 와 return 문 구 를 통 해 데 이 터 를 되 돌 릴 수 없습니다.전통 적 인 동기 개발 모델 에서 우리 가 함 수 를 호출 할 때 이 함수 의 매개 변 수 를 통 해 데 이 터 를 전송 하고 이 함수 의 반환 값 을 통 해 최종 계산 결 과 를 되 돌려 줍 니 다.그러나 다 중 스 레 드 의 비동기 개발 모델 에서 데이터 의 전달 과 반환 과 동기 개발 모델 은 큰 차이 가 있다.스 레 드 의 운행 과 끝 은 예측 할 수 없 기 때문에 데 이 터 를 전달 하고 되 돌 릴 때 함수 처럼 함수 파라미터 와 return 문 구 를 통 해 데 이 터 를 되 돌 릴 수 없습니다.본 고 는 상기 원인 에 대해 스 레 드 에 데 이 터 를 전달 하 는 몇 가지 방법 을 소개 하고 다음 글 에서 스 레 드 에서 데 이 터 를 되 돌려 주 는 방법 을 소개 한다.        먼저 하려 면 반드시 먼저 주어 야 한다.일반적으로 스 레 드 를 사용 할 때 데 이 터 를 초기 화 한 다음 에 스 레 드 는 이 데 이 터 를 이용 하여 가공 처 리 를 하고 결 과 를 되 돌려 야 한다.이 과정 에서 가장 먼저 해 야 할 일 은 스 레 드 에 데 이 터 를 전달 하 는 것 이다.1.구조 적 방법 으로 데 이 터 를 전달 합 니 다.        스 레 드 를 만 들 때 Thread 클래스 나 하위 클래스 의 인 스 턴 스 를 만들어 야 합 니 다.따라서 start 방법 을 호출 하기 전에 스 레 드 류 의 구조 방법 을 통 해 데 이 터 를 스 레 드 에 전송 할 생각 은 어렵 지 않다.스 레 드 를 사용 할 수 있 도록 전 송 된 데 이 터 를 클래스 변 수 를 저장 합 니 다(사실은 run 방법 에서 사용 합 니 다).다음 코드 는 구조 적 방법 을 통 해 데 이 터 를 전달 하 는 방법 을 보 여 줍 니 다.        코드 는 다음 과 같 습 니 다:
package mythread;
public class MyThread1 extends Thread {
	private String name;
	public MyThread1(String name) {
		this.name = name;
	}
	public void run() {
		System.out.println("hello " + name);
	}
	public static void main(String[] args) {
		Thread thread = new MyThread1("world");
		thread.start();
	}
} 

         이러한 방법 은 스 레 드 대상 을 만 드 는 동시에 데 이 터 를 전달 하 는 것 이기 때문에 스 레 드 가 실행 되 기 전에 이 데 이 터 는 이미 도착 했다.그러면 데이터 가 스 레 드 가 실 행 된 후에 야 들 어 오 는 현상 을 초래 하지 않 을 것 이다.더 복잡 한 데 이 터 를 전달 하려 면 집합,클래스 등 데이터 구 조 를 사용 할 수 있다.구조 적 방법 으로 데 이 터 를 전달 하 는 것 은 안전 하지만 전달 할 데이터 가 많 을 경우 불편 이 많다.자바 에 기본 매개 변수 가 없 기 때문에 기본 매개 변수 와 유사 한 효 과 를 실현 하려 면 재 로드 를 사용 해 야 합 니 다.그러면 구조 방법 자체 가 너무 복잡 할 뿐만 아니 라 구조 방법 도 수량 적 으로 크게 증가 할 수 있 습 니 다.따라서 이런 상황 을 피 하려 면 클래스 방법 이나 클래스 변 수 를 통 해 데 이 터 를 전달 해 야 한다.2.변수 와 방법 으로 데 이 터 를 전달 합 니 다.        대상 에 데 이 터 를 전송 하 는 데 는 일반적으로 두 번 의 기회 가 있 습 니 다.첫 번 째 기 회 는 대상 을 만 들 때 구조 적 방법 으로 데 이 터 를 전송 하 는 것 입 니 다.다른 기 회 는 클래스 에서 일련의 Public 방법 이나 변 수 를 정의 하 는 것 입 니 다.그리고 대상 을 만 든 후에 대상 인 스 턴 스 를 통 해 하나씩 값 을 부여 합 니 다.다음 코드 는 MyThread 1 클래스 를 변경 하 는 것 입 니 다.setName 방법 으로 name 변 수 를 설정 합 니 다.        코드 는 다음 과 같 습 니 다:
package mythread;
public class MyThread2 implements Runnable {
	private String name;
	public void setName(String name) {
		this.name = name;
	}
	public void run(){
		System.out.println("hello " + name);
	}
	public static void main(String[] args) {
		MyThread2 myThread = new MyThread2();
		myThread.setName("world");
		Thread thread = new Thread(myThread);
		thread.start();
	}
} 

 3.리 턴 함수 로 데 이 터 를 전달 합 니 다.        위 에서 토론 한 두 가지 스 레 드 에 데 이 터 를 전달 하 는 방법 이 가장 자주 사용 된다.그러나 이 두 가지 방법 은 모두 main 방법 에서 자발적으로 데 이 터 를 스 레 드 류 에 전송 하 는 것 이다.이것 은 스 레 드 에 있어 서 수 동적 으로 이 데 이 터 를 받 는 것 이다.그러나 일부 응용 프로그램 에 서 는 스 레 드 가 실행 되 는 과정 에서 동적 으로 데 이 터 를 가 져 와 야 합 니 다.예 를 들 어 아래 코드 의 run 방법 에서 3 개의 랜 덤 수가 생 긴 다음 에 Work 류 의 process 방법 을 통 해 이 세 개의 랜 덤 수의 합 을 구하 고 Data 류 의 value 를 통 해 결 과 를 되 돌려 줍 니 다.이 예 를 통 해 알 수 있 듯 이 value 로 돌아 가기 전에 세 개의 무 작위 수 를 얻어 야 한다.즉,이 value 는 사전에 스 레 드 류 에 들 어 갈 수 없다.        코드 는 다음 과 같 습 니 다:
package mythread;
class Data {
	public int value = 0;
}

class Work{
	public void process(Data data, Integer numbers) {
		for (int n : numbers) {
			data.value += n;
		}
	}
}


public class MyThread3 extends Thread {
	private Work work;
	public MyThread3(Work work) {
		this.work = work;
	}
	public void run() {
		java.util.Random random = new java.util.Random();
		Data data = new Data();
		int n1 = random.nextInt(1000);
		int n2 = random.nextInt(2000);
		int n3 = random.nextInt(3000);
		work.process(data, n1, n2, n3); //       
		System.out.println(String.valueOf(n1) + "+" + String.valueOf(n2) + "+" + String.valueOf(n3) + "=" + data.value);
	}
	public static void main(String[] args) {
		Thread thread = new MyThread3(new Work());
		thread.start();
	}
}

 
 
 

좋은 웹페이지 즐겨찾기