Executor Service. shutdown () 은 스 레 드 가 실 행 된 후에 야 닫 을 수 있 습 니 다.

4537 단어 다 중 스 레 드
블 로 그 를 보면 다음 과 같다.
[url=http://bbs.csdn.net/topics/390268738자바 다 중 스 레 드 - 스 레 드 풀 Executor Service. shutdown 언제 실행 [/ url]
질문
Executor Service. shutdown () 은 스 레 드 가 실 행 된 후에 야 닫 을 수 있 습 니 다.
그러나 내 가 신 호 량 을 계산 한 후에 스 레 드 가 아직 끝나 지 않 았 다 는 것 을 알 고 그 는 shutdown () 을 실행 했다.
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.Semaphore;

public class SemaphoreTest extends Thread {
Semaphore position;
private int id;

public SemaphoreTest(int i, Semaphore s) {
this.id = i;
this.position = s;
}

public void run() {
try {
if (position.availablePermits() > 0) {
System.out.println(" [" + id + "] , ");
} else {
System.out.println(" [" + id + "] , , ");
}
position.acquire();
System.out.println("【" + id + "】acquire ");
Thread.sleep((int) (Math.random() * 1000));
System.out.println("【" + id + "】 release");
position.release();
} catch (Exception e) {
e.printStackTrace();
}
}

public static void main(String args[]) {
ExecutorService pool = Executors.newCachedThreadPool();
Semaphore position = new Semaphore(2); //
for (int i = 0; i < 5; i++) {
pool.submit(new SemaphoreTest(i, position));
}
System.out.println(" ");
pool.shutdown();
System.out.println(" ");
position.acquireUninterruptibly(2);
System.out.println(" , ");
position.release(2);
}
}

PS:
1. 코드 에서 메 인 스 레 드 는 스 레 드 탱크 가 실 행 될 때 까지 기다 리 지 않 고 계속 아래로 실 행 됩 니 다.
2. 신 호 량 에 대해 서 는 몇 개의 서브 스 레 드 사이 에서 만 역할 을 발휘 합 니 다.
3. 메 인 스 레 드 와 스 레 드 탱크 는 직접적인 관계 가 없고 스 레 드 탱크 는 자신의 스 레 드 를 사용 합 니 다.생명주기 도 서로 독립 한다.
4. shutdown () 은 주 스 레 드 가 스 레 드 풀 을 닫 으 라 고 요구 하지만 이 를 위해 스 레 드 풀 이 실 행 될 때 까지 기다 리 지 않 습 니 다.
5. 실제 대기 역할 을 발휘 한 것 은 스 레 드 탱크 가 제공 하 는 능력 (물론 스 레 드 탱크 도 이러한 능력 을 제공 한 것) 이 아니 라 position. acquire Uninterruptibly (2) 라 는 말 입 니 다.
shutdown () 은 함수 로 서 당연히 즉시 실행 합 니 다. 즉, 새로운 임 무 를 받 지 않 습 니 다.그러나 실행 중인 임 무 를 강제로 중지 하거나 이미 제출 한 임 무 를 취소 하지 않 는 다.즉, 이전에 제출 한 5 개의 작업 은 여전히 실 행 될 것 이 며, 주 라인 의 생명주기 와 무관 하 다. 즉, 당신 이 직접 뒤에 다음 과 같이 쓰 더 라 도: if (1 = 1) return;주 함 수 를 즉시 끝내 면 스 레 드 탱크 의 5 가지 임 무 를 순조롭게 수행 할 수 있 습 니 다.
6. 또 다른 닮 은 함 수 는:
shutdown Now (), 이 함 수 는 shutdown () 보다 더 독 합 니 다. 두 가지:
1) 、 수행 하지 않 은 퀘 스 트 에 대해 모두 취소 합 니 다.
2) 、 실행 중인 작업 에 대해 interrupt () 을 보 냅 니 다.
그러나 프로그램 이 이상 이 발생 했 을 때 신 호 량 을 정확하게 방출 하지 않 았 기 때문에 (finally 블록 에 넣 어야 합 니 다) shutdown Now () 로 바 꾸 면 문제 가 발생 합 니 다. 메 인 라인 죽음 등 입 니 다.
[url=http://lavasoft.blog.51cto.com/62575/115112자바 5 동시 학습 [/ url]
[url=http://www.cnblogs.com/wanqieddy/p/3853863.html] ExecutorService 에서 submit 와 execute 의 차이 [/ url]
[url=http://wosyingjun.iteye.com/blog/2302628자바 스 레 드 흔 한 면접 문제 [/ url]
[url=http://yizhenn.iteye.com/blog/2303195] JAVA 병발 - 명시 적 잠 금 (1) [/ url]
	public List selectRecipeSumVO(final AlertMessageKeyword query, PageBreaker page, final Integer engineRunFlag) {
List list = optAlertmessageStatisticMapper.selectRecipeSumVO(this.getBaseDBName(), query, page, engineRunFlag);

if (null == list || list.isEmpty()) {
log.warn(" ");
return list;
}

//ExecutorService EXECUTORSERVICE = Executors.newFixedThreadPool(50);
List> listFuture = new ArrayList<>();

try {
for (final DrugDpInfoVO e : list) {
Future future = EXECUTORSERVICE.submit(new Callable() {

@Override
public DrugDpInfoVO call() throws Exception {

DrugDpInfoVO drugDpInfoVO = optAlertmessageStatisticMapper.selectSingleRecipeSumVO(getBaseDBName(), query, e, engineRunFlag);
drugDpInfoVO.setAmount(e.getAmount());
return drugDpInfoVO;

}
});

listFuture.add(future);
}

list.clear();

for (Future future : listFuture) {
list.add(future.get());
}

} catch (Exception e) {
log.error(e.getMessage(), e);
}

return list;
}

좋은 웹페이지 즐겨찾기