2014-11-18 2 views
0

내가 알고 싶은 것은 우아한 방법으로 java.util.concurrent.Executor 작업을 중지하는 방법이 있거나 우리는 하나의 계층 인 java.util.concurrent.ExecutorService를 사용해야합니다. 위의 java.util.concurrent.Executor (java.util.concurrent.ExecutorService에는 셧다운을위한 API가있다)?java.util.concurrent.Executor 작업을 중단하는 방법

package com.example; 

import java.util.concurrent.Executor; 
import java.util.concurrent.Executors; 

public class ExecutorTaskExample { 

public static void main(String[] args) { 
    Executor executor = Executors.newFixedThreadPool(5); 

    for(int i=0; i<10; i++){ 
     ThreadTask task = new ThreadTask(); 
     task.setTaskName("task_"+i); 
     executor.execute(task); 
    } 
    System.out.println("Program Completed"); 
} 

} 

class ThreadTask implements Runnable{ 
private String taskName; 

@Override 
public void run(){ 
    System.out.println("Task: "+this.getTaskName()+"processed by "+Thread.currentThread().getName()); 
    try { 
     Thread.sleep(1000); 
    } catch (InterruptedException e) { 
     e.printStackTrace(); 
    } 
} 

public String getTaskName() { 
    return taskName; 
} 

public void setTaskName(String taskName) { 
    this.taskName = taskName; 
} 

}

답변

1

java.util.concurrent.Executor에는 작업을 종료하는 특정 방법이 없습니다.

이 목적으로 java.util.concurrent.ExecutorService을 사용할 수 있습니다.

내가 코드를 아래 시도 :

ExecutorService executor = Executors.newFixedThreadPool(5); 

for(int i=0; i<10; i++){ 
    ThreadTask task = new ThreadTask(); 
    task.setTaskName("task_"+i); 
    executor.execute(task); 

    if (some condition) { 
     executor.shutdown(); 
    } 
} 

그러나 executor.shutdown() 메소드의 문서에 대한

Initiates an orderly shutdown in which previously submitted tasks are executed, but no new tasks will be accepted. Invocation has no additional effect if already shut down.

가 업데이트 상태. 나는 이것이 당신이 찾고 있었던 것이라고 생각합니다.

public static void main(String[] args) { 
    ExecutorService executor = Executors.newFixedThreadPool(5); 
    List<Future<?>> list = new ArrayList<Future<?>>(); 

    for (int i = 0; i < 5; i++) { 
     ThreadTask task = new ThreadTask(); 
     task.setTaskName("task_" + i); 
     Future<?> future = executor.submit(task); 
     list.add(future); 
    } 
    for (Future<?> f : list) { 
     if (!f.isDone()) { 
      System.out.println("Running thread terminating"); 
      f.cancel(true); 
     } 
    } 
    for (Future<?> f : list) { 
     if (f.isDone()) { 
      System.out.println("Running thread terminated"); 
     } 
    } 
    executor.shutdown(); 
    System.out.println("Program Completed"); 
} 
+0

ExecutorService 인터페이스가 Executor 인터페이스 위에 추가되어 스레드 수명주기 관리를 처리하는 것처럼 보입니다. –

1

외부 자바에서 스레드를 중지 할 "우아한"방법은 없습니다.

"shouldStop"플래그를 수시로 확인하고 코드를 종료해야합니다.

어떤 API를 사용하든 관계없이이 기능은 별다른 차이가 없습니다.

ExecutorService # shutdown은 현재 실행중인 작업에 아무 것도하지 않습니다. 대기열에있는 작업이있는 경우 계속 대기열에있는 작업을 계속 시작할 것입니다. 그것은 단지 새로운 것들을 받아들이지 않을 것입니다.

ExecutorService # shutdown 이제 실행중인 스레드에 interrupt()을 전송한다는 점에서 조금 더 공격적입니다 (하지만 여전히 실행중인 응용 프로그램 코드에서 어떻게 처리해야하는지).

FWIW, 귀하의 스레드 수면은 그런 식으로 중단됩니다.

+0

업데이트 된 코드를 검토해 주실 수 있습니까? 그것은 자바에서 스레드를 외부 적으로 허용하는 방법 일 수 있습니까? –

관련 문제