并发任务
来源:互联网 发布:php如何返回302状态码 编辑:程序博客网 时间:2024/05/23 02:03
在关注并发前,我们需要了解一些相关概念。
线程与进程
运行在系统上的每个程序都是一个进程。一个进程可包含多个线程。进程和线程都表示一个逻辑控制流,即一种计算过程。进程独立占用管理物理资源,线程共享同一个进程中的物理资源和数据。可以采用多进程来实现程序的并发。CPU资源是固定的,CPU通过多线程的切换实现并发。即线程轮流执行一个时间片,实现多个任务同时执行。
多线程使用要考虑用户交互与计算资源。对于计算密集型程序,计算机线程切换带来的损失要小于多线程带来的好处。对于用户交互频繁的程序,利用多线程减少串行计算用户的等待时间,但这样会加大线程切换的损失。
内核线程:每个线程都由操作系统内核支持,系统开销大,充分发挥计算机并行计算的优势。
轻量级进程:建立在内核之上并由内核支持的用户线程,它是内核线程的高度抽象,与内核线程是一对一的线程模型,各种操作都需要系统调度,代价高,需要频繁在用户态和内核态切换。每个轻量级进程是独立的调度单元,不会影响整个进程的工作。
用户线程:用户线程存在于单一的进程之上。各种操作不需要内核的帮助,消耗低、高效。
Java线程的实现
Windows和linux版,JDK采用一条java线程映射到一条轻量级进程之中。
线程安全
当前线程操作的同时不会因为其它线程操作而产生不同的结果。
多线程任务
编写多线程程序一般有三种方法,Thread,Runnable,Callable.
java.util.concurrent
接口 Callable<V>
类型参数:
V - call 方法的结果类型
所有已知子接口:
JavaCompiler.CompilationTask
public interface Callable<V>
返回结果并且可能抛出异常的任务。实现者定义了一个不带任何参数的叫做 call 的方法。
Callable 接口类似于 Runnable,两者都是为那些其实例可能被另一个线程执行的类设计的。但是 Runnable 不会返回结果,并且无法抛出经过检查的异常。
Executors类包含一些从其他普通形式转换成 Callable 类的实用方法。
Runnable和Callable的区别是,
(1)Callable规定的方法是call(),Runnable规定的方法是run().
(2)Callable的任务执行后可返回值,而Runnable的任务是不能返回值得
(3)call方法可以抛出异常,run方法不可以
(4)运行Callable任务可以拿到一个Future对象,Future 表示异步计算的结果。它提供了检查计算是否完成的方法,以等待计算的完成,并获取计算的结果。计算完成后只能使用 get 方法来获取结果,如果线程没有执行完,Future.get()方法可能会阻塞当前线程的执行;如果线程出现异常,Future.get()会throws InterruptedException或者ExecutionException;如果线程已经取消,会跑出CancellationException。取消由cancel 方法来执行。isDone确定任务是正常完成还是被取消了。一旦计算完成,就不能再取消计算。如果为了可取消性而使用 Future 但又不提供可用的结果,则可以声明Future<?> 形式类型、并返回 null 作为底层任务的结果。Future接口的定义如下:
java.util.concurrent
接口 Future<V>
类型参数:
V - 此 Future 的 get 方法所返回的结果类型
所有已知子接口:
Response<T>, RunnableFuture<V>, RunnableScheduledFuture<V>, ScheduledFuture<V>
所有已知实现类:
FutureTask, SwingWorker
public interface Future<V>
Future表示异步计算的结果。它提供了检查计算是否完成的方法,以等待计算的完成,并获取计算的结果。计算完成后只能使用get方法来获取结果,如有必要,计算完成前可以阻塞此方法。取消则由cancel方法来执行。还提供了其他方法,以确定任务是正常完成还是被取消了。一旦计算完成,就不能再取消计算。如果为了可取消性而使用Future但又不提供可用的结果,则可以声明Future<?>形式类型、并返回null作为底层任务的结果。
- 以runnable方式运行:
- 线程池方式
- 并发任务
- 并发任务
- Java并发--任务执行
- Java并发--任务执行
- Java并发--任务执行
- 并发_任务协作
- Java并发--任务执行
- python 并发任务
- Spring控制任务并发
- Quartz任务并发处理
- 并发编程--并发阶段任务的运行
- Apache 多任务并发处理
- Java并发(3) 终结任务
- java并发编程-限时任务
- 并发编程7 - 任务取消
- Shell 实现多任务并发
- 并发1:任务与线程
- Java并发之终结任务
- Synchronized
- HDU1009 FatMouse' Trade贪心
- CAS的实现Atomic类库
- AbstractQueuedSynchronizer(一)
- J.U.C重入锁
- 并发任务
- 队列(Queue)
- JDK线程池的实现
- 四元数
- 并发控制
- UT、IT、ST、UAT
- JVM对象
- 对象的创建
- 对象内存布局与访问