62,614
社区成员
发帖
与我相关
我的任务
分享
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() "+futures.get(i).get());//能看到具体哪个线程。
}
System.out.println("程序结束!");
exe.shutdown();//加上
}
}
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().getName()+" is "+Thread.currentThread().getState());//加上线程名。
return sum;
}
}