저는 JTabbedpane이있는 패널을 가지고 있고 모든 탭에서 쿼리를 실행하기위한 매개 변수를 설정할 수 있습니다. 하나의 쿼리가 데이터베이스에서 자신의 데이터를 검색하는 중 바쁠 때 이미 새 탭을 열어 새 매개 변수를 설정할 수 있습니다. 데이터베이스에 대한 과부하를 피하려면 한 번에 하나의 쿼리 만 실행하면됩니다. 그러나 실행을 클릭하면 프로그램이 올바른 순서로 실행할 쿼리를 기억해야합니다. 실행 중에는 실행 중지를 위해 클릭 할 수있는 중지 버튼이 있기 때문에 로더 아이콘이 표시되고 GUI가 고정되지 않을 수 있습니다.
스윙 워커 (swingworker)를 사용하여 쿼리를 실행하는 동안 GUI가 차단되는 것을 막았습니다. 하지만 이제 이전 쿼리가 끝나기 전에 다음 쿼리가 시작되지 않도록하고 싶습니다.스윙 워커를 세마포어로 순차적으로 실행하십시오.
private void doStoredQuery() {
try {
semaphore.acquire();
System.out.println(queryName + "started");
worker.execute();
} catch (InterruptedException e) {
throw new RuntimeException(e);
}
}
(내가 추가 한에 println이 시작되는 참조 명령을 중지 또는 종료)이이 SwingWorker의 시작 코드가
private final Semaphore semaphore = new Semaphore(1, true);
: 모델에서, 전체 패널에 대한 일반적인, 나는 세마포어를 초기화
그리고 이것은 (initializeWorker()가 메인 클래스의 생성자에서 호출) 내 SwingWorker의이다 : 나는 취득을 넣고 코드의 다른 위치에 출시하려고했습니다
private SwingWorker<StoredQueryDataModel, Integer> initializeWorker() {
worker = new SwingWorker<StoredQueryDataModel, Integer>() {
@Override
protected StoredQueryDataModel doInBackground() throws Exception {
try {
StoredQueryDataModel dataModel = null;
publish(0);
try {
dataModel = new StoredQueryDataModel(queryRunner, ldbName, queryName, params);
} catch (S9SQLException e) {
//
} catch (Throwable e) {
showErrorMessage(e);
}
return dataModel;
}
finally {
semaphore.release();
System.out.println(queryName + "finished");
}
}
@Override
protected void process(List<Integer> chunks) {
//ignore chunks, just reload loader icon
panel.repaint();
}
@Override
protected void done() {
String error;
try {
result = get();
error = null;
} catch (Exception e) {
error = e.getMessage();
}
if(result == null) {
semaphore.release();
System.out.println(queryName + " stopped");
}
if(error == null) {
// process result
}
else {
showErrorMessage(new Throwable(error));
}
}
};
return worker;
}
,하지만 아무것도가 보인다 작업. 나는 Swingworker와 sempahores에서 아주 새로운 ... 누군가 도울 수 있습니까?