码迷,mamicode.com
首页 > 编程语言 > 详细

多线程基础

时间:2015-04-09 00:38:37      阅读:145      评论:0      收藏:0      [点我收藏+]

标签:

使用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. 无状态的对象(既不包含域也不包含对其他域的引用)一定是线程安全的
  2. 假定有两个操作A和B,如果从执行a的线程来看,当另一个线程执行B,要么将B完全执行完,要么完全不执行B,那么A和B对彼此就是原子的
  3. 使用原子类:
     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 }

     在实际的开发中应该尽量的使用线程安全的对象来管理类的状态,与非线程安全的对象相比,判断线程安全的对象的可能状态以及其状态转换情况更为容易。从而也容易维护和验证线程安全性。

  4. 同步代码块包括两部分的内容,一个为锁的对象引用,一个座位由这个锁保护的代码块。synchronized修饰的方法就是一种横跨整个方法体的同步代码块,该代码块的锁就是方法调用所在的对象,静态的synchronized方法通常使用Class对象作为锁。
  5. 一种常见的约定是:将所有的可变状态都封装在对象的内部,并通过对象的内置锁对所有访问可变状态的代码路径进行同步,使得该对象上不会发生并发访问。
  6. 当执行时间较长的计算或者是可能无法快速完成的操作时,一定不要持有锁。

 

多线程基础

标签:

原文地址:http://www.cnblogs.com/luochuanghero/p/4392352.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!