문제

자바 스레딩과 동시성의 세계에 관해서는 상당히 순진합니다. 나는 현재 배우려고 노력하고있다. 나는 동시성이 어떻게 작동하는지 알아 내려고 간단한 예를 만들었습니다.

내 코드는 다음과 같습니다.

import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;

public class ThreadedService {

    private ExecutorService exec;

    /**
     * @param delegate
     * @param poolSize
     */
    public ThreadedService(int poolSize) {
        if (poolSize < 1) {
            this.exec = Executors.newCachedThreadPool();
        } else {
            this.exec = Executors.newFixedThreadPool(poolSize);
        }
    }

    public void add(final String str) {
        exec.execute(new Runnable() {
            public void run() {
                System.out.println(str);
            }

        });

    }

    public static void main(String args[]) {
        ThreadedService t = new ThreadedService(25);
        for (int i = 0; i < 100; i++) {
            t.add("ADD: " + i);
        }
    }

}

코드가 순차적으로 0-99를 인쇄하려면 어떻게해야합니까?

도움이 되었습니까?

해결책

스레드 풀 일반적으로 필요하지 않은 작업에 사용됩니다 동기화 또는 높습니다 평행한.

숫자 0-99 인쇄는 순차적으로 순차적으로 문제가되지 않으며 순서대로 인쇄를 피하기 위해 스레드를 동기화해야합니다.

나는 그것을 살펴 보는 것이 좋습니다 Java 동시성 수업 자바에서 동시성에 대한 아이디어를 얻으려면.

다른 팁

실에 대한 아이디어는 순차적으로 일을하는 것이 아닙니다.

조정하려면 공유 상태가 필요합니다. 예에서는이 예제에서 인스턴스 필드를 외부 클래스에 추가하면 작동합니다. ADD에서 매개 변수를 제거합니다. 잠금 객체와 카운터를 추가하십시오. 잠금 장치를 잡고 숫자를 인쇄하고 숫자를 증가시키고 숫자를 해제하십시오.

문제에 대한 가장 간단한 해결책은 1의 스레드 풀 크기를 사용하는 것입니다. 그러나 이것은 실제로 스레드를 사용하여 해결해야 할 문제는 아닙니다.

확장하려면 : 유언 집행자를 만들면 다음과 같습니다.

this.exec = Executors.newSingleThreadExecutor();

그런 다음 실행을 위해 제출 된 순서대로 스레드가 예약되고 실행됩니다. 이것이 논리적 인 일인 몇 가지 시나리오가 있지만 대부분의 경우 스레드는이 문제를 해결하는 데 사용하는 잘못된 도구입니다.

이런 종류의 일은 다른 스레드에서 작업을 실행해야 할 때해야 할 의미가 있습니다. 아마도 실행하는 데 시간이 오래 걸리고 GUI 스레드를 차단하고 싶지 않지만 필요하지 않거나 돈이 필요하지 않습니다. '제출 된 작업이 동시에 실행되기를 원합니다.

문제는 정의에 따라 스레드에 적합하지 않습니다. 스레드는 독립적으로 실행되며 실제로 어떤 스레드가 먼저 실행되는지 예측할 수있는 방법이 없습니다.

순차적으로 실행되도록 코드를 변경하려면 다음을 변경하십시오.

public void add(final String str) {
    System.out.println(str);
}

당신은 스레드를 사용하지 않고 (적어도 자신의 것이 아님) 모든 것이 순차적으로 발생합니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top