java가 다중 스레드에 매개 변수를 전달하는 세 가지 방법 상세 소개

전통적인 동기화 개발 모델에서 우리가 함수를 호출할 때 이 함수의 매개 변수를 통해 데이터를 전송하고 이 함수의 반환값을 통해 최종 계산 결과를 되돌려줍니다.그러나 다중 스레드의 비동기 개발 모델에서 데이터의 전달과 귀환과 동기화 개발 모델은 큰 차이가 있다.루틴의 운행과 끝은 예측할 수 없기 때문에 데이터를 전달하고 되돌릴 때 함수처럼 함수 매개 변수와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();
}
}
이런 방법은 스레드 대상을 만드는 동시에 데이터를 전달하기 때문에 스레드가 실행되기 전에 이런 데이터가 이미 도착했기 때문에 데이터가 스레드가 실행된 후에야 전송되는 현상을 일으키지 않는다.더 복잡한 데이터를 전달하려면 집합, 클래스 등 데이터 구조를 사용할 수 있다.구조 방법을 사용하여 데이터를 전달하는 것은 비교적 안전하지만 전달하고자 하는 데이터가 비교적 많으면 많은 불편을 초래할 수 있다.Java는 기본 매개 변수가 없기 때문에 기본 매개 변수와 같은 효과를 실현하려면 재부팅을 사용해야 한다. 이렇게 하면 구조 방법 자체가 너무 복잡할 뿐만 아니라 구조 방법도 수량적으로 크게 증가할 수 있다.따라서 이런 상황을 피하려면 유형 방법이나 유형 변수를 통해 데이터를 전달해야 한다.둘째, 변수와 방법을 통해 데이터를 전달하여 대상에 전송하는 것은 일반적으로 두 번의 기회가 있다. 첫 번째 기회는 대상을 구축할 때 구조 방법을 통해 데이터를 전송하는 것이다. 다른 기회는 클래스에서 일련의public 방법이나 변수(글자라고 할 수도 있다)를 정의하는 것이다.그리고 대상을 세운 후에 대상의 실례를 통해 하나씩 값을 부여한다.다음 코드는 MyThread1 클래스의 버전입니다. 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 방법을 통해 이 3개의 랜덤 수의 합을 구하고 데이터 클래스의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();
}
}
위 코드에서의process 방법은 리셋 함수라고 불린다.본질적으로 말하자면, 리셋 함수는 사건 함수이다.Windows API에서는 항상 콜백 함수와 API를 호출하는 프로그램 간에 데이터 상호작용을 합니다.따라서 리셋 함수를 호출하는 과정은 가장 원시적인 사건을 일으키는 과정이다.이 예에서 프로세스 방법을 호출해서 데이터를 얻는 것도 런 방법에서 하나의 사건을 일으킨 것과 같다.

좋은 웹페이지 즐겨찾기