标签:
使用Executor
Executor允许你管理异步任务的执行而无须显式的管理线程的生命周期。单个executor被用来创建和管理系统中的所有的任务。
public class CacheThreadPool {
public static void main(String[] args) {
ExecutorService exec = Executors.newCachedThreadPool();
for (int i = 0; i < 5; i++) {
exec.execute(new LiftOff());
}
exec.shutdown();
}
}
对于shutdown方法的调用可以防止新的被提交给Executor。这个程序将在Executor中的所有任务完成之后退出。
从线程中产生返回值
使用callable,它是一种具有类型参数的泛型,它的类型参数表示从方法call()中返回的值。并且必须使用ExecutorService.submit调用它
1 public class TaskWithResult implements Callable<String> { 2 3 private int id; 4 5 public TaskWithResult(int id) { 6 this.id = id; 7 } 8 9 @Override 10 public String call() throws Exception { 11 return "result of task with id:" + id; 12 } 13 14 public static void main(String[] args) { 15 ExecutorService exec = Executors.newCachedThreadPool(); 16 ArrayList<Future<String>> results = new ArrayList<>(); 17 18 for (int i = 0; i < 10; i++) { 19 results.add(exec.submit(new TaskWithResult(i))); 20 } 21 22 for (Future<String> fs : results) { 23 try { 24 System.out.println(fs.get()); 25 } catch (Exception e) { 26 } finally { 27 exec.shutdown(); 28 } 29 } 30 } 31 }
submit()方法会产生Feature对象,它用callable返回结果的特定类型进行了参数化,当任务完成之后可以调用get()方法来获取返回结果。
1 class CountFactorizer implements Servlet 2 { 3 private final AtomicLong count = new AtomicLong(0); 4 5 private long getCount(){return count.get();} 6 7 private void service(ServletRequest req,ServletResponse resp){ 8 BigInteger i = get(req); 9 count.increamAndget(); 10 } 11 }
在实际的开发中应该尽量的使用线程安全的对象来管理类的状态,与非线程安全的对象相比,判断线程安全的对象的可能状态以及其状态转换情况更为容易。从而也容易维护和验证线程安全性。
标签:
原文地址:http://www.cnblogs.com/luochuanghero/p/4392352.html