작업공간이 동시성 프레임워크를 사용하지 않는 경우에도 동시성을 잘 알고 있어야 함을 이미 확인했습니다. 작업공간 변경 및 스케줄링 규칙 사용을 일괄처리하면 작업공간을 수정 중인 다른 플러그인(및 해당 스레드)과 작업공간을 공유하는 데 도움이 됩니다. 플러그인이 일괄처리 및 규칙(자원 변경 일괄처리 참조)을 사용 중이면 플랫폼 동시성 메커니즘을 사용하여 동일한 작업을 수행하기가 쉽습니다.
작업은 다른 작업과 동시에 실행 중인 비동기 작업의 기본 단위입니다. 자원 플러그인은 WorkspaceJob을 비동기 자원 수정을 정의하는 편리한 메커니즘으로 정의합니다. IWorkspaceRunnable에서 정상적으로 일괄처리되는 코드는 작업공간 작업 하위 유형인 runInWorkspace 메소드에 대신 배치됩니다. 작업은 IWorkspace 프로토콜을 사용하여 코드를 실행하는 대신 다른 작업과 마찬가지 방식으로 스케줄됩니다. 작업이 스케줄되기 전에 적절한 스케줄링 규칙이 작업에 추가되어야 합니다.
예제 작업공간 실행 프로그램 및 작업으로 작성하기 위해 수행해야 할 사항을 살펴보기로 합니다.
IWorkspaceRunnable myRunnable = new IWorkspaceRunnable() { public void run(IProgressMonitor monitor) throws CoreException { //do the actual work in here doSomeWork(); ... } }
작업이 WorkspaceJob 하위 유형에 적절한 메소드로 이동합니다.
class MyWorkspaceJob extends WorkspaceJob { public MyWorkspaceJob() { super("My Workspace Job"); } public IStatus runInWorkspace(IProgressMonitor monitor) { //do the actual work in here doSomeWork(); return Status.OK_STATUS; } }
실행 프로그램은 다음과 같이 특별히 호출되어야 합니다.
IWorkspace workspace = ResourcesPlugin.getWorkspace(); workspace.run(myRunnable, myProject, IWorkspace.AVOID_UPDATE, null);
작업은 다른 작업처럼 스케줄됩니다. 플랫폼 작업 관리자는 우선순위, 대기열의 다른 작업 및 스케줄링 규칙에 따라 작업을 실행합니다. myProject의 동시 수정을 방지하려면 스케줄링 규칙을 작업에 첨부해야 합니다.
MyWorkspaceJob job = new MyWorkspaceJob(); job.setRule(myProject); job.schedule();
이제 조작이 작업으로 구성되었으므로, 모든 스케줄링 메커니즘(우선순위, 지연, 재스케줄링)을 사용할 수 있습니다. 자원 변경 이벤트는 작업이 실행을 완료할 때까지 일괄처리됩니다.