ForkJoinTask 클래스
정의
중요
일부 정보는 릴리스되기 전에 상당 부분 수정될 수 있는 시험판 제품과 관련이 있습니다. Microsoft는 여기에 제공된 정보에 대해 어떠한 명시적이거나 묵시적인 보증도 하지 않습니다.
에서 실행되는 작업에 대한 추상 기본 클래스입니다 ForkJoinPool
.
[Android.Runtime.Register("java/util/concurrent/ForkJoinTask", DoNotGenerateAcw=true)]
[Java.Interop.JavaTypeParameters(new System.String[] { "V" })]
public abstract class ForkJoinTask : Java.Lang.Object, IDisposable, Java.Interop.IJavaPeerable, Java.IO.ISerializable, Java.Util.Concurrent.IFuture
[<Android.Runtime.Register("java/util/concurrent/ForkJoinTask", DoNotGenerateAcw=true)>]
[<Java.Interop.JavaTypeParameters(new System.String[] { "V" })>]
type ForkJoinTask = class
inherit Object
interface ISerializable
interface IJavaObject
interface IDisposable
interface IJavaPeerable
interface IFuture
- 상속
- 파생
- 특성
- 구현
설명
에서 실행되는 작업에 대한 추상 기본 클래스입니다 ForkJoinPool
. A ForkJoinTask
는 일반 스레드보다 훨씬 가벼운 스레드와 유사한 엔터티입니다. ForkJoinPool의 적은 수의 실제 스레드에서 일부 사용 제한의 가격으로 많은 수의 작업 및 하위 작업을 호스트할 수 있습니다.
"main" ForkJoinTask
은 명시적으로 ForkJoin ForkJoinPool
계산에 참여하지 않았거나, via #fork
또는 #invoke
관련 메서드에서 ForkJoinPool#commonPool()
시작된 경우 실행을 시작합니다. 시작되면 일반적으로 다른 하위 작업을 시작합니다. 이 클래스의 이름으로 표시된 것처럼 많은 프로그램에서는 메서드 및 #join
파생 #fork
요소(예: #invokeAll(ForkJoinTask...) invokeAll
.)만 사용합니다ForkJoinTask
. 그러나 이 클래스는 새로운 형태의 포크/조인 처리를 지원할 수 있는 확장 메커니즘뿐만 아니라 고급 사용에서 사용할 수 있는 다양한 다른 메서드도 제공합니다.
A ForkJoinTask
는 간단한 형식입니다 Future
. s의 ForkJoinTask
효율성은 순수 함수를 계산하거나 순수하게 격리된 개체에서 작동하는 계산 작업으로 주요 사용을 반영하는 제한 집합(부분적으로만 정적으로 적용 가능)에서 비롯됩니다. 기본 조정 메커니즘은 #fork
비동기 실행을 정렬하고 #join
작업의 결과가 계산될 때까지 진행되지 않는 메커니즘입니다. 계산은 메서드나 블록을 방지하는 synchronized
것이 이상적이어야 하며, 다른 작업 조인이나 포크/조인 예약과 협력하도록 보급된 단계와 같은 동기화 장치를 사용하는 것 외에 다른 차단 동기화를 최소화해야 합니다. 또한 세분화 가능한 작업은 차단 I/O를 수행하지 않아야 하며, 실행 중인 다른 태스크에서 액세스하는 것과 완전히 독립적인 변수에 액세스하는 것이 좋습니다. 이러한 지침은 throw되는 것과 같은 IOExceptions
확인된 예외를 허용하지 않음으로써 느슨하게 적용됩니다. 그러나 계산에서는 여전히 선택되지 않은 예외가 발생할 수 있습니다. 이 예외는 연결을 시도하는 호출자에게 다시 발생합니다. 또한 이러한 예외에는 내부 작업 큐 할당 실패와 같은 내부 리소스 고갈에서 비롯되는 예외가 포함될 RejectedExecutionException
수 있습니다. 다시 throw된 예외는 일반 예외와 동일한 방식으로 동작하지만, 가능하면 계산을 시작한 스레드와 예외가 실제로 발생한 스레드의 스택 추적(예: 사용 ex.printStackTrace()
)을 포함합니다. 최소한 후자만 포함됩니다.
차단할 수 있는 ForkJoinTasks를 정의하고 사용할 수 있지만, 이렇게 하려면 세 가지 추가 고려 사항이 필요합니다. (1) 외부 동기화 또는 I/O를 차단하는 작업에 종속되어야 하는 기타</em> 작업이 있는 <>경우 몇 개만 완료해야 합니다. 조인되지 않는 이벤트 스타일 비동기 작업(예: 서브클래싱 CountedCompleter
)은 종종 이 범주에 속합니다. (2) 리소스 영향을 최소화하려면 작업이 작아야 합니다. 이상적으로는 (가능한) 차단 작업만 수행합니다. (3) API를 ForkJoinPool.ManagedBlocker
사용하거나 차단된 작업의 수가 풀 ForkJoinPool#getParallelism
수준보다 작은 것으로 알려져 있지 않은 경우 풀은 진행률 또는 양호한 성능을 보장하기 위해 충분한 스레드를 사용할 수 있다고 보장할 수 없습니다.
작업의 #join
완료를 기다리고 결과를 추출하는 기본 방법은 다음과 같습니다. 그러나 몇 가지 변형이 있습니다. 메서드는 Future#get
규칙을 사용하여 Future
완료 및/또는 시간 제한 대기를 지원하고 결과를 보고합니다. 메서드 #invoke
는 의미상 동일 fork(); join()
하지만 항상 현재 스레드에서 실행을 시작하려고 시도합니다. 이러한 메서드의 "<em>quiet</em>" 형식은 결과 또는 보고서 예외를 추출하지 않습니다. 이러한 작업은 작업 집합이 실행될 때 유용할 수 있으며 모든 작업이 완료될 때까지 결과 또는 예외 처리를 지연해야 합니다. 메서드 invokeAll
(여러 버전에서 사용 가능)는 태스크 집합을 포크하고 모두 조인하는 가장 일반적인 형태의 병렬 호출을 수행합니다.
가장 일반적인 사용에서 포크 조인 쌍은 병렬 재귀 함수에서 호출(포크) 및 반환(조인)처럼 작동합니다. 다른 형태의 재귀 호출과 마찬가지로 가장 먼저 반환(조인)을 수행해야 합니다. 예를 들어 이전에 조인 a.fork(); b.fork(); b.join(); a.join();
하는 것보다 훨씬 더 효율적일 수 있습니다 a
b
.
태스크의 실행 상태는 여러 세부 수준에서 쿼리할 수 있습니다. 즉, #isDone
어떤 방식으로든 완료된 작업(실행하지 않고 작업이 취소된 경우 포함) #isCompletedNormally
은 true이고, 작업이 취소되지 않았거나 예외가 발생하지 않은 경우 true이고, #isCancelled
작업이 취소된 경우(이 경우 #getException
반환 CancellationException
됨) true이고 #isCompletedAbnormally
, 작업이 취소되었거나 예외가 발생한 경우 true입니다. 이 경우 #getException
발생한 예외 또는 CancellationException
.
ForkJoinTask 클래스는 일반적으로 직접 서브클래스되지 않습니다. 대신 특정 스타일의 포크/조인 처리를 지원하는 추상 클래스 중 하나를 서브클래싱합니다. 일반적으로 RecursiveAction
결과를 반환하지 않는 대부분의 계산, RecursiveTask
수행되는 계산 및 CountedCompleter
완료된 작업이 다른 작업을 트리거하는 클래스에 대해 서브클래싱합니다. 일반적으로 구체적인 ForkJoinTask 하위 클래스는 생성자에 설정된 매개 변수로 구성된 필드를 선언한 다음 이 기본 클래스에서 제공하는 컨트롤 메서드를 사용하는 메서드를 정의합니다 compute
.
메서드 #join
와 해당 변형은 완료 종속성이 순환적일 때만 사용하기에 적합합니다. 즉, 병렬 계산을 DAG(방향성 순환 그래프)로 설명할 수 있습니다. 그렇지 않으면 태스크가 주기적으로 서로를 기다리기 때문에 실행에서 교착 상태의 형태가 발생할 수 있습니다. 그러나 이 프레임워크는 정적으로 DAG로 구조화되지 않은 문제에 대해 사용자 지정 서브클래스를 생성하는 데 사용할 수 있는 다른 메서드 및 기술(예Phaser
#helpQuiesce
: 사용, 및#complete
)을 지원합니다. 이러한 사용을 지원하기 위해 ForkJoinTask는 사용하거나 #compareAndSetForkJoinTaskTag
사용하여 #getForkJoinTaskTag
#setForkJoinTaskTag
확인되는 값으로 short
태그<가 지정된/em>을 원자적으로 <포함>할 수 있습니다. ForkJoinTask 구현은 이러한 protected
메서드 또는 태그를 어떤 용도로도 사용하지 않지만 특수 서브클래스를 생성할 때 사용할 수 있습니다. 예를 들어 병렬 그래프 순회는 제공된 메서드를 사용하여 이미 처리된 노드/작업을 다시 방문하지 않도록 할 수 있습니다. (태그 지정에 대한 메서드 이름은 사용 패턴을 반영하는 메서드의 정의를 장려하기 위해 부분적으로 부피가 깁니다.)
대부분의 기본 지원 방법은 final
기본 경량 작업 예약 프레임워크에 본질적으로 연결된 구현의 재정의를 방지하기 위한 것입니다. 포크/조인 처리의 새로운 기본 스타일을 만드는 개발자는 메서드#setRawResult
#exec
를 최소한으로 구현 protected
해야 하며, 서브클래스에서 구현할 수 있는 추상 계산 메서드도 도입해야 하며#getRawResult
, 이 클래스에서 제공하는 다른 protected
메서드에 의존할 수도 있습니다.
ForkJoinTasks는 비교적 적은 양의 계산을 수행해야 합니다. 대용량 작업은 일반적으로 재귀 분해를 통해 더 작은 하위 작업으로 분할되어야 합니다. 엄지 손가락의 매우 거친 규칙으로, 작업은 100 이상 및 10000 미만의 기본 계산 단계를 수행해야하며 무기한 반복을 피해야합니다. 태스크가 너무 크면 병렬 처리량을 향상시킬 수 없습니다. 너무 작으면 메모리 및 내부 작업 유지 관리 오버헤드로 인해 처리가 과부하가 발생할 수 있습니다.
이 클래스는 다른 종류의 작업과 Callable
실행을 혼합할 때 사용할 수 있는 메서드 Runnable
및 메서드를 제공합니다 adapt
ForkJoinTasks
. 모든 작업이 이 형식인 경우 em asyncMode</em에서 <생성된 풀을 사용하는 것이 좋습니다>.>
ForkJoinTasks는 Serializable
원격 실행 프레임워크와 같은 확장에서 사용할 수 있도록 합니다. 실행 전이나 후에만 작업을 직렬화하는 것이 합리적이지만 실행 중에는 직렬화하지 않는 것이 좋습니다. serialization은 실행 자체 중에 의존하지 않습니다.
1.7에 추가되었습니다.
에 대한 java.util.concurrent.ForkJoinTask
Java 설명서
이 페이지의 일부는 Android 오픈 소스 프로젝트에서 만들고 공유하고 Creative Commons 2.5 특성 라이선스에 설명된 용어에 따라 사용되는 작업을 기반으로 하는 수정 사항입니다.
생성자
ForkJoinTask() |
호출할 서브클래스에 대한 생성자입니다. |
ForkJoinTask(IntPtr, JniHandleOwnership) |
JNI 개체의 관리되는 표현을 만들 때 사용되는 생성자입니다. 런타임에서 호출합니다. |
속성
Class |
이 |
Exception |
기본 계산에서 throw된 예외 또는 |
ForkJoinTaskTag |
이 작업의 태그를 반환합니다. |
Handle |
기본 Android 인스턴스에 대한 핸들입니다. (다음에서 상속됨 Object) |
IsCancelled |
이 작업이 정상적으로 완료되기 전에 취소되었는지를 반환 |
IsCompletedAbnormally |
이 작업이 예외를 throw했거나 취소된 경우를 반환 |
IsCompletedNormally |
|
IsDone |
이 작업이 완료되었는지를 반환합니다 |
JniIdentityHashCode |
에서 실행되는 작업에 대한 추상 기본 클래스입니다 |
JniPeerMembers |
에서 실행되는 작업에 대한 추상 기본 클래스입니다 |
PeerReference |
에서 실행되는 작업에 대한 추상 기본 클래스입니다 |
Pool |
현재 스레드를 호스팅하는 풀을 반환하거나 |
QueuedTaskCount |
현재 작업자 스레드에서 포크되었지만 아직 실행되지 않은 작업의 예상 수를 반환합니다. |
RawRawResult |
이 작업이 비정상적으로 완료되었거나 |
SurplusQueuedTaskCount |
현재 작업자 스레드가 보유하고 있는 로컬 큐에 대기 중인 작업의 수를 다른 작업자 스레드보다 더 많이 보유하는 것으로 추정하고, 이 스레드가 ForkJoinPool에서 작동하지 않는 경우 0을 반환합니다. |
ThresholdClass |
이 API는 Android용 Mono 인프라를 지원하며 코드에서 직접 사용할 수 없습니다. |
ThresholdType |
이 API는 Android용 Mono 인프라를 지원하며 코드에서 직접 사용할 수 없습니다. |
메서드
Adapt(ICallable) |
지정된 메서드를 |
Adapt(IRunnable) |
지정된 메서드를 |
Adapt(IRunnable, Object) |
지정된 메서드를 |
Cancel(Boolean) |
이 작업의 실행을 취소하려고 시도합니다. |
Clone() |
이 개체의 복사본을 만들고 반환합니다. (다음에서 상속됨 Object) |
CompareAndSetForkJoinTaskTag(Int16, Int16) |
이 작업의 태그 값을 조건부로 설정합니다. |
Complete(Object) |
이 작업을 완료하고, 아직 중단되거나 취소되지 않은 경우 이후 |
CompleteExceptionally(Throwable) |
이 작업을 비정상적으로 완료하고, 아직 중단되거나 취소되지 않은 경우 지정된 예외 |
Dispose() |
에서 실행되는 작업에 대한 추상 기본 클래스입니다 |
Dispose(Boolean) |
에서 실행되는 작업에 대한 추상 기본 클래스입니다 |
Equals(Object) |
다른 개체가 이 개체와 "같음"인지 여부를 나타냅니다. (다음에서 상속됨 Object) |
Exec() |
이 메서드에서 반환될 때 이 작업이 완료되도록 보장되면 즉시 이 작업의 기본 작업을 수행하고 true를 반환합니다. |
Fork() |
현재 작업이 실행 중인 풀에서 이 작업을 비동기적으로 실행하도록 정렬합니다(해당하는 경우). 그렇지 않은 |
Get() |
계산이 완료될 때까지 필요한 경우 대기한 다음 결과를 검색합니다. |
Get(Int64, TimeUnit) |
계산이 완료될 때까지 최대 지정된 시간 동안 필요한 경우 대기한 다음, 사용 가능한 경우 결과를 검색합니다. |
GetHashCode() |
개체에 대한 해시 코드 값을 반환합니다. (다음에서 상속됨 Object) |
HelpQuiesce() |
현재 작업 ForkJoinPool#isQuiescent를 호스팅하는 풀이 정지될 때까지 태스크를 실행할 수 있습니다. |
InForkJoinPool() |
|
Invoke() |
이 작업 수행을 시작하고, 필요한 경우 완료를 기다리고, 결과를 반환하거나,(선택되지 않은) |
InvokeAll(ForkJoinTask, ForkJoinTask) |
지정된 태스크를 포크하여 각 태스크에 대한 보류 또는 (선택되지 않은) 예외가 발생할 때 |
InvokeAll(ForkJoinTask[]) |
지정된 컬렉션의 모든 태스크를 포크하여 각 태스크에 대한 보류 또는 (선택되지 않은) 예외가 발생할 때 |
InvokeAll(ICollection) |
지정된 컬렉션의 모든 태스크를 포크하여 각 태스크에 대한 보류 또는 (선택되지 않은) 예외가 발생할 때 |
JavaFinalize() |
가비지 수집에서 개체에 대한 참조가 더 이상 없다고 판단할 때 개체의 가비지 수집기에서 호출됩니다. (다음에서 상속됨 Object) |
Join() |
#isDone 계산이 완료되면 계산 결과를 반환합니다. |
Notify() |
이 개체의 모니터에서 대기 중인 단일 스레드를 해제합니다. (다음에서 상속됨 Object) |
NotifyAll() |
이 개체의 모니터에서 대기 중인 모든 스레드를 해제합니다. (다음에서 상속됨 Object) |
PeekNextLocalTask() |
현재 스레드에서 대기 중이지만 아직 실행되지 않은 작업을 즉시 사용할 수 있는 경우 예약을 취소하거나 실행하지 않습니다. |
PollNextLocalTask() |
현재 스레드가 ForkJoinPool에서 작동하는 경우 예약을 취소하고 실행하지 않고 현재 스레드에서 큐에 대기했지만 아직 실행되지 않은 다음 작업을 반환합니다. |
PollTask() |
현재 스레드가 ForkJoinPool에서 작동하는 경우 실행하지 않고 예약을 취소하고 반환합니다. 현재 스레드에서 큐에 대기 중이지만 아직 실행되지 않은 다음 작업은 사용 가능한 경우 또는 사용할 수 없는 경우 다른 스레드에 의해 포크된 작업(사용 가능한 경우)입니다. |
QuietlyComplete() |
값을 설정하지 않고 이 작업을 정상적으로 완료합니다. |
QuietlyInvoke() |
이 작업을 시작하고 필요한 경우 결과를 반환하거나 예외를 throw하지 않고 완료를 기다립니다. |
QuietlyJoin() |
결과를 반환하거나 예외를 throw하지 않고 이 작업을 조인합니다. |
Reinitialize() |
이 작업의 내부 부기 상태를 다시 설정하여 후속 |
SetForkJoinTaskTag(Int16) |
이 작업의 태그 값을 원자성으로 설정하고 이전 값을 반환합니다. |
SetHandle(IntPtr, JniHandleOwnership) |
Handle 속성을 설정합니다. (다음에서 상속됨 Object) |
SetRawResult(Object) |
지정된 값이 결과로 반환되도록 합니다. |
ToArray<T>() |
에서 실행되는 작업에 대한 추상 기본 클래스입니다 |
ToString() |
개체의 문자열 표현을 반환합니다. (다음에서 상속됨 Object) |
TryUnfork() |
실행을 위해 이 작업의 일정을 취소하려고 시도합니다. |
UnregisterFromRuntime() |
에서 실행되는 작업에 대한 추상 기본 클래스입니다 |
Wait() |
현재 스레드가 각성될 때까지 대기하게 하며, 일반적으로 <알림을 받<>거나 <><중단/종료>합니다.> (다음에서 상속됨 Object) |
Wait(Int64) |
현재 스레드가 각성될 때까지 대기하게 하며, 일반적으로 <>알림을 받<거나 <중단/>종료><>하거나 일정량의 실시간 경과가 발생할 때까지 대기합니다. (다음에서 상속됨 Object) |
Wait(Int64, Int32) |
현재 스레드가 각성될 때까지 대기하게 하며, 일반적으로 <>알림을 받<거나 <중단/>종료><>하거나 일정량의 실시간 경과가 발생할 때까지 대기합니다. (다음에서 상속됨 Object) |
명시적 인터페이스 구현
IJavaPeerable.Disposed() |
에서 실행되는 작업에 대한 추상 기본 클래스입니다 |
IJavaPeerable.DisposeUnlessReferenced() |
에서 실행되는 작업에 대한 추상 기본 클래스입니다 |
IJavaPeerable.Finalized() |
에서 실행되는 작업에 대한 추상 기본 클래스입니다 |
IJavaPeerable.JniManagedPeerState |
에서 실행되는 작업에 대한 추상 기본 클래스입니다 |
IJavaPeerable.SetJniIdentityHashCode(Int32) |
에서 실행되는 작업에 대한 추상 기본 클래스입니다 |
IJavaPeerable.SetJniManagedPeerState(JniManagedPeerStates) |
에서 실행되는 작업에 대한 추상 기본 클래스입니다 |
IJavaPeerable.SetPeerReference(JniObjectReference) |
에서 실행되는 작업에 대한 추상 기본 클래스입니다 |
확장 메서드
JavaCast<TResult>(IJavaObject) |
Android 런타임 확인 형식 변환을 수행합니다. |
JavaCast<TResult>(IJavaObject) |
에서 실행되는 작업에 대한 추상 기본 클래스입니다 |
GetJniTypeName(IJavaPeerable) |
에서 실행되는 작업에 대한 추상 기본 클래스입니다 |
GetAsync(IFuture) |
에서 실행되는 작업에 대한 추상 기본 클래스입니다 |
GetAsync(IFuture, Int64, TimeUnit) |
에서 실행되는 작업에 대한 추상 기본 클래스입니다 |