2016-10-27 6 views
2

같은 폴더를 생성하기위한의 경쟁이 별도의 프레스코의 Rhino 자바 스크립트 작업을 생각해 보자 :프레스코 자바 스크립트/코뿔소 멀티 스레드 처리 및 동시성

var shared = companyhome.childByNamePath("shared"); 
var newFolderName = "folder-x"; 
var newFolder = shared.childByNamePath(newFolderName); 
if (newFolder==null) { 
    java.lang.Thread.sleep(10000);//remove this line in second thread 
    newFolder = shared.createFolder(newFolderName); 
    if (newFolder==null){ 
     logger.error("error: "+newFolderName); 
    } else { 
     logger.info("success: "+newFolderName); 
    } 
} else { 
    logger.info("already exists: "+newFolderName); 
} 

우리가 잠 (10 초)와 첫 번째 스크립트를 실행하는 경우와 다음 수면없이 두 번째 스크립트 :

  • 두 번째 스크립트는 첫 번째 스크립트는 예외
  • ,536 "파일 또는 폴더의 폴더-X는 이미"상승 할 폴더 "폴더-X"
  • 을 만듭니다

무작위 폴더를 만들려고하는 많은 경쟁 스레드를 상상해 봅시다. 지정된 폴더 만 생성하는 것을 차단하는 세마포어 또는 원자 연산과 같은 것이 있습니까 (다른 폴더에 대해 비 차단)?

+0

방금 ​​후 확인해야 이전보다 수면 ... – dandavis

답변

2

미안 해요,

... 그것은, 그것은 사소한했다 얻는 방법 createFolder() 원자과 폴더가 이미 생성 된 경우 우리는 단지 예외를 처리해야합니다

var getOrCreateFolder = function(parent, newFolderName){ 
    var newFolder = parent.childByNamePath(newFolderName); 
    if (newFolder==null) { 
     try { 
      java.lang.Thread.sleep(10000);//remove this line in second thread 
      newFolder = parent.createFolder(newFolderName); 
      return {folder:newFolder,isNew:true}; 

     } catch (e) { 
      newFolder = parent.childByNamePath(newFolderName); 
      if (newFolder!=null){ 
       return {folder:newFolder,isNew:false}; 
      } else { 
       throw e; 
      } 
     } 
    } else { 
     return {folder:newFolder,isNew:false}; 
    } 
}; 

var shared = companyhome.childByNamePath("shared"); 
var newFolderName = "folder-x"; 
var folderDto = getOrCreateFolder(shared,newFolderName); 
if (folderDto.folder==null) { 
    logger.error("error: "+newFolderName); 
} else { 
    logger.info("done: "+newFolderName+", new: "+folderDto.isNew); 
}