日期:2014-05-20  浏览次数:20716 次

java 子线程不能终止
import java.util.ArrayList;
import java.util.Collection;
import java.util.List;
import java.util.concurrent.BrokenBarrierException;
import java.util.concurrent.Callable;
import java.util.concurrent.CancellationException;
import java.util.concurrent.CompletionService;
import java.util.concurrent.CyclicBarrier;
import java.util.concurrent.ExecutionException;
import java.util.concurrent.Executor;
import java.util.concurrent.ExecutorCompletionService;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.Future;

import com.sun.corba.se.spi.orbutil.fsm.Guard.Result;


public class ThreadMessageV03 {

public static void main(String args[]) throws InterruptedException, ExecutionException {
ExecutorService exe = Executors.newFixedThreadPool(2);
SyncTest3 st = new SyncTest3();
CyclicBarrier cb = new CyclicBarrier(2);
List<Future<Integer>> futures = new ArrayList<Future<Integer>>();

for (int i=0; i<2; i++) {
Future<Integer> future = exe.submit(st);
futures.add(future);
}

//exe.shutdownNow();

//等待所有线程执行完
try {
cb.await();
} catch (InterruptedException e) {
e.printStackTrace();
} catch (BrokenBarrierException e) {
e.printStackTrace();
}

for (int i=0; i<futures.size(); i++) {
System.out.println(futures.get(i).get());
}
System.out.println("程序结束!");
}
}




class SyncTest3 implements Callable<Integer> {

private int flag = 1;
public synchronized int getFlag() {
return flag;
}

public synchronized void setFlag(int flag) {
this.flag = flag;
}

private static int sum = 0;

public Integer call() {
if (getFlag() == 1) {
System.out.println(Thread.currentThread().getName() + "-flag:" + getFlag());
for (int i=0; i<20; i++) {
//System.out.println(Thread.currentThread().getName() + "-i=" + i);
synchronized (this) {
if (sum >= 10) {
setFlag(0);
System.out.println(Thread.currentThread().getName() + "-flag:" + getFlag());
break;
}
sum ++;
}
System.out.println(Thread.currentThread().getName() + "-sum=" + sum);
}
}
System.out.println(Thread.currentThread().getState());

return sum;
}
}
java Executor Future

------解决方案--------------------
试了下代码,这样可以结束,
1 不需要设置cb.await(),线程池里的线程如果没执行完,futures.get(i).get()会阻塞的。所以不要那段代码。
2 程序结束还是要加上语句:exe.shutdown();

修改后的代码:

import java.util.ArrayList;
import java.util.Collection;
import java.util.List;
import java.util.concurrent.BrokenBarrierException;
import java.util.concurrent.Callable;
import java.util.concurrent.CancellationException;