synchronized关键字、Callable以及线程池部分总结.doc_第1页
synchronized关键字、Callable以及线程池部分总结.doc_第2页
synchronized关键字、Callable以及线程池部分总结.doc_第3页
synchronized关键字、Callable以及线程池部分总结.doc_第4页
synchronized关键字、Callable以及线程池部分总结.doc_第5页
已阅读5页,还剩1页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

Synchronized关键字从1.0版本开始,Java中的每一个对象都有一个内部锁。如果一个方法用synchronized关键字生命,那么对象的锁将保护整个方法。也就是说,要调用该方法,线程必须获得内部的对象锁。换句话说:public synchronized void method()method body等价于public void method()rinsicLock.lock();trymethod bodyfinally rinsicLock.unlock();必须了解每一个对象有一个内部锁,并且该锁有一个内部条件。由锁来管理那些试图进入synchronized方法的线程,由条件来管理那些调用wait的线程。将静态方法声明为synchronized也是合法的。如果调用这种方法,该方法获得这个类的内部锁。(注:原文里是“获得类对象的内部锁”,为了避免出现理解误差,此处改为“类的内部锁”)例如:如果Bank类有一个静态同步的方法,那么该方法被调用时,Bank.class的锁被锁住。因此,没有其他线程可以调用同一个类的这个或任何其他的同步静态方法。个人备注:关键在于区别成员方法和类方法的区别。synchronized的4种用法1. 方法声明时使用,线程获得的是成员锁.2. 对某一代码块使用,synchronized后跟括号,括号里是变量,线程获得的是成员锁.3synchronized后面括号里是一对象,此时,线程获得的是对象锁.4synchronized后面括号里是类,此时,线程获得的是对象锁.一、当两个并发线程访问同一个对象object中的这个synchronized(this)同步代码块时,一个时间内只能有一个线程得到执行。另一个线程必须等待当前线程执行完这个代码块以后才能执行该代码块。二、然而,当一个线程访问object的一个synchronized(this)同步代码块时,另一个线程仍然可以访问该object中的非synchronized(this)同步代码块。三、尤其关键的是,当一个线程访问object的一个synchronized(this)同步代码块时,其他线程对object中所有其它synchronized(this)同步代码块的访问将被阻塞。四、第三个例子同样适用其它同步代码块。也就是说,当一个线程访问object的一个synchronized(this)同步代码块时,它就获得了这个object的对象锁。结果,其它线程对该object对象所有同步代码部分的访问都被暂时阻塞。五、以上规则对其它对象锁同样适用.Runnable封装一个异步运行的任务,可以把它想象成为一个没有参数和返回值得异步方法。Callable和 Runnable 类似,但是有返回值。Callable接口是一个参数化的类型,只有一个方法call。public interface CallableV call() throws Exception;类型参数是返回值的类型。例如Callable表示一个最终返回Integer对象的异步计算。Future保存异步计算的结果,可以启动一个计算,将Future对象交给某个线程,然后忘掉它。Future对象的所有者在结果计算好之后就可以获得它。public interface FutureV get() throws ;方法被阻塞,直到计算完成。V get(lont timeout, TimeUnit unit) throws ;如果在计算完成之前,第二个方法的调用超时,抛出TimeoutException异常。如果运行计算的线程被中断,则两个get方法都将抛出InterruptedException。如果计算已经完成,那么get方法立即返回。void cancel(boolean mayInterrupt);使用该方法取消该计算,如果计算还未开始,它被取消且不再开始。如果计算处于运行之中,那么如果参数为true,它就被中断。boolean isCancelled();如果在任务正常完成前将其取消,则返回true。boolean isDone();如果在任务已完成,则返回true。public class FutureTaskextends Objectimplements Future, RunnableFutureTask 包装器是一种非常方便的机制,可以将Callable转换成Future 和 Runnable,它同时实现二者的接口FutureTask(Callablecallable) 创建一个 FutureTask,一旦运行就执行给定的 Callable。FutureTask(Runnablerunnable, Vresult) 创建一个 FutureTask,一旦运行就执行给定的 Runnable,并安排成功完成时 get 返回给定的结果 。例如:Callable myCall = .;FutureTask task = new FutureTask(myCall);Thread t = new Thread(task);/ 在这里是一个Runnablet.start();.Integer result = task.get(); /在这里是一个Future构建一个新的线程是有一定代价的,因为涉及与操作系统的交互。如果程序中创建了大量的生命期很短的线程,应该使用线程池(thread pool).一个线程池中包含许多准备运行的空闲线程,将Runnable对象交给线程池,就会有一个线程调用run方法。当run方法退出时,线程不会死亡,而是在池中准备为下一个请求提供服务。另一个使用线程池的理由是减少并发线程的数目。创建大量线程会大大降低性能甚至使虚拟机崩溃。如果有一个会创建许多线程的算法,应该使用一个线程数“固定的”线程池以限制并发线程的总数。java.util.concurrent接口 Executor所有已知子接口:ExecutorService, ScheduledExecutorService所有已知实现类:AbstractExecutorService, ScheduledThreadPoolExecutor, ThreadPoolExecutor执行器类(Executor)类有许多静态工厂方法用来构建线程池。java.util.concurrent.Executorspublic class Executorsextends ObjectExecutorService newCachedThreadPool()返回一个带缓存的线程池,该池在必要时创建新线程;空闲线程会被保留60秒ExecutorService newFixedThreadPool(int size)返回一个线程池,该池包含固定数量的线程;空闲线程会一支被保留ExecutorService newSingleThreadExecutor只有一个线程的“池”,该线程顺序执行每一个提交的任务这三个方法返回实现了ExecutorService接口的ThreadPoolExecutor类的对象。Java.util.concurrent.ExecutorService可用下面的方法之一将一个Runnable对象或Callable对象提交给ExecutorService:Future submit(Runnable task)返回一个Future可以使用这样的一个对象来调用isDone、cancel或isCancelled。但是,get方法在完成的时候只是简单的返回null。Future submit(Runnable task, T result)返回的Future的get方法在完成的时候返回指定的result对象。Future submit(Callable task)返回的Future对象将在计算结果准备好的时候得到它。sutdown()当用完一个线程池的时候,调用shutdown()方法方法启动该池的关闭序列,被关闭的执行器不再接受新的任务。当所有任务都完成以后,线程池中的线程死亡。shutdownNow()该方法取消尚未开始的的所有任务并试图中断正在运行的线程。下面总结在使用线程池时应该做的事:1) 调用Executors类中静态的方法 newCachedThreadPool或.2) 调用submit提交Runnable 或Callable对象3) 如果想要取消一个任务,或如果提交Callable对象,那就需要保存好返回的Future对象4) 当不需要提交任何任务时,调用shutdown。补充:ScheduleExecutorSer

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论