Java 다중 루틴 프로그래밍의 액세스 공유 대상과 데이터 방법
1. 각 노선이 실행하는 코드가 같다. 예를 들어 매표: 여러 개의 창에서 이 100장의 표를 동시에 팔고 이 100장의 표는 여러 개의 노선 공유가 필요하다.
2. 각 노드가 실행하는 코드가 다르다. 예를 들어 네 개의 노드를 설계하는데 그 중에서 두 개의 노드는 매번 j에 1씩 증가하고 다른 두 개의 노드는 매번 j에 1씩 감소한다.
a. 각 루틴이 실행하는 코드가 같으면 같은 Runnable 대상을 사용할 수 있습니다. 이 대상에 공유 데이터가 있습니다.표를 팔면 이렇게 할 수 있다. 모든 창구에서 표를 파는 임무를 하고 있다. 표를 파는 것은 모두 같은 데이터이다(구체적인 사례를 클릭하십시오).
b. 각 루틴이 실행하는 코드가 다르면 서로 다른 Runnable 대상을 사용해야 한다. 두 가지 방식으로 Runnable 대상 간의 데이터 공유를 실현해야 한다.
1), 공유 데이터를 하나의 대상에 단독으로 봉인하고 대상에 이러한 공유 데이터를 조작하는 방법을 제공하면 공유 데이터의 각종 조작에 대한 상호 배척과 통신을 편리하게 실현할 수 있다.
2,) 각 Runnable 대상을 특정한 클래스의 내부 클래스로 하고 공유 데이터를 외부 클래스의 구성원 변수로 하며 공유 데이터에 대한 조작 방법도 외부 클래스에서 제공하여 상호 배척과 통신을 실현하도록 한다. 내부 클래스의 Runnable 대상은 외부 클래스에서 공유 데이터를 조작하는 방법을 호출하면 된다.
package com.ljq.test.thread;
/**
*
*
* , j 1, j 1。 100 。
*
* @author Administrator
*
*/
public class MultiThreadShareData {
private static ShareData data1 = new ShareData();
public static void main(String[] args) {
ShareData data2 = new ShareData();
new Thread(new DecrementRunnable(data2)).start();
new Thread(new IncrementRunnable(data2)).start();
final ShareData data1 = new ShareData();
new Thread(new Runnable() {
@Override
public void run() {
data1.decrement();
}
}).start();
new Thread(new Runnable() {
@Override
public void run() {
data1.increment();
}
}).start();
}
}
/**
* , j 1
*
* @author Administrator
*
*/
class DecrementRunnable implements Runnable {
private ShareData data;
public DecrementRunnable(ShareData data) {
this.data = data;
}
public void run() {
for(int i=0; i<100; i++){
data.decrement();
}
}
}
/**
* , j 1
*
* @author Administrator
*
*/
class IncrementRunnable implements Runnable {
private ShareData data;
public IncrementRunnable(ShareData data) {
this.data = data;
}
public void run() {
for(int i=0; i<100; i++){
data.increment();
}
}
}
/**
*
*
* @author Administrator
*
*/
class ShareData {
private int j = 0;
/**
* j 1
*/
public synchronized void increment() {
j++;
System.out.println("j++="+j);
}
/**
* j 1
*/
public synchronized void decrement() {
j--;
System.out.println("j--="+j);
}
}
주의: 동기화되어야 할 몇 단락의 코드는 각각 몇 가지 독립된 방법에 두는 것이 가장 좋다. 이런 방법은 다시 같은 종류에 두면 비교적 쉽게 그들 간의 동기화와 통신을 실현할 수 있다.
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 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에 따라 라이센스가 부여됩니다.