# Android용 Java에서 Aspose.Slides 멀티스레딩

> Android용 Java에서 Aspose.Slides 멀티스레딩은 PowerPoint 및 OpenDocument 처리를 향상시킵니다. 효율적인 프레젠테이션 워크플로를 위한 모범 사례를 확인하세요.

Source: https://docs.aspose.com/slides/ko/androidjava/multithreading/
Updated: 2026-06-14

## **소개**

프레젠테이션을 사용한 병렬 작업은 (구문 분석/로드/복제 제외) 가능하고 대부분 정상적으로 동작하지만, 라이브러리를 여러 스레드에서 사용할 때 잘못된 결과가 나올 가능성이 있습니다.

멀티스레드 환경에서 단일 [Presentation](https://reference.aspose.com/slides/ko/androidjava/com.aspose.slides/Presentation) 인스턴스를 **사용하지 말 것을 강력히 권장**합니다. 예측할 수 없는 오류나 실패가 발생할 수 있으며 이를 쉽게 감지하기 어렵습니다.

여러 스레드에서 [Presentation](https://reference.aspose.com/slides/ko/androidjava/com.aspose.slides/Presentation) 클래스의 인스턴스를 로드, 저장 및/또는 복제하는 것은 **안전하지 않습니다**. 이러한 작업은 **지원되지 않습니다**. 해당 작업이 필요하다면 여러 단일 스레드 프로세스로 작업을 병렬화하고, 각 프로세스는 자체 프레젠테이션 인스턴스를 사용해야 합니다.

## **프레젠테이션 슬라이드를 병렬로 이미지로 변환**

PowerPoint 프레젠테이션의 모든 슬라이드를 PNG 이미지로 병렬 변환한다고 가정해 보겠습니다. 단일 `Presentation` 인스턴스를 여러 스레드에서 사용하는 것은 안전하지 않으므로, 프레젠테이션 슬라이드를 별개의 프레젠테이션으로 나누고 각 프레젠테이션을 별도 스레드에서 이미지로 변환합니다. 아래 코드 예제는 이를 수행하는 방법을 보여줍니다.

```java
String inputFilePath = "sample.pptx";
final String outputFilePathTemplate = "slide_%d.png";
final float imageScale = 2;

Presentation presentation = new Presentation(inputFilePath);

int slideCount = presentation.getSlides().size();
SizeF slideSize = presentation.getSlideSize().getSize();
float slideWidth = (float) slideSize.getWidth();
float slideHeight = (float) slideSize.getHeight();

List<Thread> threads = new ArrayList<Thread>(slideCount);

for (int slideIndex = 0; slideIndex < slideCount; slideIndex++) {
	// 슬라이드 i를 별도의 프레젠테이션으로 추출합니다.
	final Presentation slidePresentation = new Presentation();
	slidePresentation.getSlideSize().setSize(slideWidth, slideHeight, SlideSizeScaleType.DoNotScale);
	slidePresentation.getSlides().removeAt(0);
	slidePresentation.getSlides().addClone(presentation.getSlides().get_Item(slideIndex));

	// 슬라이드를 별도의 작업에서 이미지로 변환합니다.
	final int slideNumber = slideIndex + 1;
	threads.add(new Thread(new Runnable() {
		@Override
		public void run() {
			IImage image = null;
			try {
				ISlide slide = slidePresentation.getSlides().get_Item(0);

				image = slide.getImage(imageScale, imageScale);
				String imageFilePath = String.format(outputFilePathTemplate, slideNumber);
				image.save(imageFilePath, ImageFormat.Png);
			} finally {
				if (image != null) image.dispose();
				slidePresentation.dispose();
			}
		}
	}));
}

// 모든 작업이 완료될 때까지 기다립니다.
try {
	for (Thread t : threads) {
		t.join();
	}
} catch (InterruptedException e) {
	e.printStackTrace();
}

presentation.dispose();
```

## **FAQ**

**스레드마다 라이선스 설정을 호출해야 합니까?**

아니요. 스레드가 시작되기 전에 프로세스/앱 도메인당 한 번만 수행하면 충분합니다. [license setup](/slides/ko/androidjava/licensing/)이 동시에 호출될 수 있는 경우(예: 지연 초기화 중) 해당 호출을 동기화하세요. 라이선스 설정 메서드 자체가 스레드 안전하지 않기 때문입니다.

**`Presentation` 또는 `Slide` 객체를 스레드 간에 전달할 수 있습니까?**

“실시간” 프레젠테이션 객체를 스레드 간에 전달하는 것은 권장되지 않습니다. 스레드당 독립적인 인스턴스를 사용하거나 각 스레드용 별도 프레젠테이션/슬라이드 컨테이너를 미리 생성하세요. 이 접근 방식은 단일 프레젠테이션 인스턴스를 스레드 간에 공유하지 말라는 일반 권장 사항을 따릅니다.

**각 스레드가 자체 `Presentation` 인스턴스를 갖는 경우, PDF, HTML, 이미지 등 서로 다른 형식으로의 내보내기를 병렬화해도 안전합니까?**

예. 독립적인 인스턴스와 별도 출력 경로를 사용하면 이러한 작업은 일반적으로 올바르게 병렬화됩니다. 공유 프레젠테이션 객체와 공유 I/O 스트림은 피하세요.

**멀티스레딩 환경에서 전역 폰트 설정(폴더, 대체 등)은 어떻게 해야 합니까?**

스레드 시작 전에 모든 전역 [font settings](/slides/ko/androidjava/powerpoint-fonts/)을 초기화하고 병렬 작업 중에는 변경하지 마세요. 이는 공유 폰트 리소스에 대한 경쟁 조건을 방지합니다.
