사용자가 작업을 생성하기 위해 일부 데이터를 받아들이는 웹 응용 프로그램이 있으며 작업이 실행되어야합니다.자바 스레드 대기 및 자동 시작
작업을 실행하면 인터넷에서 무언가를 다운로드하는 데 시간이 걸리므로 작업을 수행 할 새 스레드를 만들려고했습니다.
이 내 생각이다 :
만들고 데이터를 다운로드하는 데 사용되는
LoaderThread
. 그리고LoaderThread
은Task
에 사용 된ArrayList
필드를 보유합니다.Servlet
요청 및 응답을 처리합니다.Servlet
시작, 서블릿을 실행하는 동안LoaderThread
을 시작
LoaderThread
에 작업을 추가.
이
코드 (그들 중 일부 생략)이다public class RwdServlet extends HttpServlet {
private StaticMapLoader loader;
@Override
public void init() throws ServletException {
super.init();
loader = new StaticMapLoader();
loader.startRunning();
}
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
Task t=createTask(req);
loader.addTask(t);
}
@Override
public void destroy() {
loader.stopRunning();
}
}
public class StaticMapLoader extends Thread {
private List<Task> tasks = new ArrayList<Task>();
private boolean running = false;
@Override
public void run() {
while (running) {
if (tasks.size() > 0) {
Task t = tasks.get(0);
log.info(t);
if (t != null && t.status == Status.waiting) {
tasks.remove(0);
t.status = Status.running;
downLoad(t);
}
}
}
}
private void downLoad(Task t) {
//download file
}
public void addTask(Task t) {
tasks.add(t);
}
public void startRunning() {
running = true;
this.start();
}
public void stopRunning() {
running = false;
this.interrupt();
}
}
위의 코드는 작동했지만 나는 심지어 tasks
이 비어있는 것을 발견하고, 새로운 task
이 추가되지 루프가 계속 달릴거야.
그렇다면 아무런 작업이 없을 때 잠깐 중단하고 새로운 작업이 나올 때 알려 주면됩니다.
@Override
public void run() {
while (running) {
if (tasks.size() > 0) {
Task t = tasks.get(0);
log.info(t);
if (t != null && t.status == Status.waiting) {
tasks.remove(0);
t.status = Status.running;
downLoad(t);
}
} else {
try {
wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}
나는 tasks
가 비어있는 경우 wait()
전화를 시도 :
하지만 어떻게 깨우는 지 모르겠습니까?
또한 애플리케이션을 개선하기 위해 알아야 할 것이 있습니까?
BWT, 둘 이상의 LoaderThread
인스턴스가 만들어 질 수 있습니까? 그렇다면 어떻게 피하는가?
내가 다른 구현을 사용할 수있는 것 같다,하지만 내 경우 리팩터링-수 있을까?
내가 놓친 몇 가지 사실을 배우고 싶습니다. :) 감사.
'ExecutorService'가 (가) 자동으로 대기 및 종료 할 수 있습니까? – hguser
자동으로 일어나서 무엇을 의미합니까? 초기화 할 때와 대기 모드에서'ExecutorService' 작업을 제출하기 전에. 작업을 제출하면 비동기 적으로 계산이 시작됩니다. – nkukhar
모든 작업은 끝났습니다. 'ExecutorService'는 다시 "대기"상태가되고 잠시 후 새 작업이 작업에 추가되면 시작됩니까? – hguser