2012-06-09 1 views
0

단일 Java ScriptEngine을 사용하여 여러 평가를 동 기적으로 수행하는 방법은 무엇입니까? 예Java ScriptEngine을 사용하여 여러 평가를 동 기적으로 수행

방법 항목은 방법 2는 sce.eval(code2);

는 다음 평가를 모두 포함하는 경우 동시에 실행

sce.eval(code1);

포함 동기화 된 방법

+1

귀하의 질문에 대한 이해가 어렵습니다. 명확히하십시오. 특히 이것이 의미하는 바는 "두 방법이 동기화되면 평가가 동시에 실행됩니까?" – Bill

+0

단일 Java ScriptEngine을 사용하여 여러 평가를 동 기적으로 수행하는 방법은 무엇입니까? <--- – Dagon

답변

1

동기화되고 concurently 하나가 다른 사람의 반대이므로 함께 맞지 않습니다. eval 메소드가 동기화되면 동일한 컨텍스트를 사용하는 scriptengine 인스턴스가 2 개 필요합니다. 여기에 없으면 병렬/동시 실행에 대한 설명이옵니다.

두 가지 방법을 동시에 실행하려면 단일 스레드로 실행되는 둘 이상의 스레드가 실행 파이프 라인을 순차적으로 실행해야합니다.

동기화는 스레드 안전성을 의미하며 클래스의 동기화 된 메서드에 대한 모든 호출을 대기열에 넣습니다. 예를 들어, m1과 m2가 동기화되면 thread1이 m1과 thread2를 호출하여 m2를 호출합니다. 처음에는 respctive 메소드에 도달하는 첫 번째 메소드가 올바르게 실행됩니다. 두 번째 메소드는 다른 메소드가 종료 될 때까지 대기합니다 (완전히 사실이 아닙니다).

동시에 여러 threada를 실행하고 각각이 자신의 파이프 라인/실행 atack을 실행하려면 이제 Thread, ExecutorService 및 Executors 클래스를 살펴볼 수 있습니다.

마지막으로 두 스레드가 동일한 스크립트 엔진을 공유하도록하려면 해당 객체의 동일한 참조를 사용해야합니다. 가장 좋은 방법은 객체의 생성자에 제공하는 것입니다.

그러나 문제가 발생하는 곳입니다. 스크립트 엔진이 동시성을 제대로 처리하지 못한다면 이상한 동작을 일으킬 수 있으므로 스크래치 엔진의 사양을 읽고 사용중인 구현이 스레드 안전 (따라서 동시에 실행 안전)인지 확인해야합니다.

간단한 예 :

public void launchAsync(final String code) { 
    new Thread() { 
     public void run() { 
      engine.eval(code); 
     } 
    }.run(); 
} 

이 두 번 메소드를 호출하면 (이 아닌 다른 스레드에서) 병렬로 실행하는 것을 의미 메인 스레드보다 비동기 코드를 실행합니다.

+0

그래서 멀티 스레드 인 경우 오브젝트가 동시에 실행됩니다. 아마도 이것은 왜 내가 데드락 (deadlock)에 의해 아마도 런타임 에러가 생기는 것일까하는 이유이다. 그래서 어떻게 비동기 소스를 실행합니다 개체를 정렬 할 수 있습니까? 왜냐하면 각 리소스에 대해 복제하면 내 CPU에서 과도한 소비가 발생할 것이기 때문입니다. – Dagon

관련 문제