`

51、java.util.concurrent 包及其常用类

阅读更多

一、软件包 java.util.concurrent 

 

  • 在并发编程中很常用的实用工具类。

二、java.util.concurrent.Executors

/**
 * Executors
 * 此包中所定义的 Executor、ExecutorService、ScheduledExecutorService、ThreadFactory 和 Callable 类的工厂和实用方法。
 * 全是静态方法
 */
public class Executors
{
	//返回用于创建新线程的默认线程工厂。此工厂创建同一 ThreadGroup 中 Executor 使用的所有新线程。
	public static ThreadFactory defaultThreadFactory(){}

	/**
	 * 创建一个可根据需要创建新线程的线程池,但是在以前构造的线程可用时将重用它们。
	 * 对于执行很多短期异步任务的程序而言,这些线程池通常可提高程序性能。
	 * 调用 execute 将重用以前构造的线程(如果线程可用)。如果现有线程没有可用的,则创建一个新线程并添加到池中。
	 * 终止并从缓存中移除那些已有 60 秒钟未被使用的线程。
	 * 因此,长时间保持空闲的线程池不会使用任何资源
	 */
	public static ExecutorService newCachedThreadPool(){}

	//创建一个可重用固定线程数的线程池,以共享的无界队列方式来运行这些线程。
	public static ExecutorService newFixedThreadPool(int nThreads){}

	//创建一个线程池,它可安排在给定延迟后运行命令或者定期地执行。
	public static ScheduledExecutorService newScheduledThreadPool(int corePoolSize){}

	/**
	 * 创建一个使用单个 worker 线程的 Executor,以无界队列方式来运行该线程。
	 * (注意,如果因为在关闭前的执行期间出现失败而终止了此单个线程,那么如果需要,一个新线程将代替它执行后续的任务)。
	 */
	public static ExecutorService newSingleThreadExecutor(){}

	//创建一个单线程执行程序,它可安排在给定延迟后运行命令或者定期地执行
	public static ScheduledExecutorService newSingleThreadScheduledExecutor(){}
}

 

三、java.util.concurrent.ThreadFactory

/**
 * ThreadFactory
 * 根据需要创建新线程的对象。使用线程工厂就无需再手工编写对 new Thread 的调用了,从而允许应用程序使用特殊的线程子类、属性等等。 
 */
public interface ThreadFactory
{
	//构造一个新 Thread。实现也可能初始化属性、名称、守护程序状态、ThreadGroup 等等
	Thread newThread(Runnable r);
}

 

四、java.util.concurrent.Executor

 /**
 * Executor
 * 执行已提交的 Runnable 任务的对象
 * 此接口提供一种将任务提交与每个任务将如何运行的机制(包括线程使用的细节、调度等)分离开来的方法。
 * 通常使用 Executor 而不是显式地创建线程。
 * 此包中提供的 Executor 实现实现了 ExecutorService,这是一个使用更广泛的接口。
 * ThreadPoolExecutor 类提供一个可扩展的线程池实现。
 * Executors 类为这些 Executor 提供了便捷的工厂方法。
 */
public interface Executor
{
	//在未来某个时间执行给定的命令。该命令可能在新的线程、已入池的线程或者正调用的线程中执行,这由 Executor 实现决定。
	void execute(Runnable command);
}

 

五、java.util.concurrent.ExecutorService

/**
 * ExecutorService
 * 可以关闭 ExecutorService,这将导致其拒绝新任务。
 * 方法 invokeAny 和 invokeAll 是批量执行的最常用形式,它们执行任务 collection,然后等待至少一个,或全部任务完成
 */ 
public interface ExecutorService extends Executor
{
	/**
	 * 执行给定的任务,当所有任务完成时,返回保持任务状态和结果的 Future 列表
	 * 如果正在进行此操作时修改了给定的 collection,则此方法的结果是不确定的。 
	 */
	<T> List<Future<T>> invokeAll(Collection<? extends Callable<T>> tasks)
                          throws InterruptedException;

	//执行给定的任务,当所有任务完成或超时期满时(无论哪个首先发生),返回保持任务状态和结果的 Future 列表
	<T> List<Future<T>> invokeAll(Collection<? extends Callable<T>> tasks,
                              long timeout,
                              TimeUnit unit)
                          throws InterruptedException;

	/**
	 * 执行给定的任务,如果某个任务已成功完成(也就是未抛出异常),则返回其结果。
	 * 一旦正常或异常返回后,则取消尚未完成的任务。
	 * 如果此操作正在进行时修改了给定的 collection,则此方法的结果是不确定的。
	 */
	<T> T invokeAny(Collection<? extends Callable<T>> tasks)
            throws InterruptedException,
                   ExecutionException;
	<T> T invokeAny(Collection<? extends Callable<T>> tasks,
                long timeout,
                TimeUnit unit)
            throws InterruptedException,
                   ExecutionException,
                   TimeoutException;

	//启动一次顺序关闭,执行以前提交的任务,但不接受新任务。如果已经关闭,则调用没有其他作用。
	void shutdown();

	//试图停止所有正在执行的活动任务,暂停处理正在等待的任务,并返回等待执行的任务列表
	List<Runnable> shutdownNow();

	//提交一个返回值的任务用于执行,返回一个表示任务的未决结果的 Future。该 Future 的 get 方法在成功完成时将会返回该任务的结果。
	<T> Future<T> submit(Callable<T> task);

	//提交一个 Runnable 任务用于执行,并返回一个表示该任务的 Future。该 Future 的 get 方法在成功完成时将会返回给定的结果。
	<T> Future<T> submit(Runnable task,
                     T result);

	//提交一个 Runnable 任务用于执行,并返回一个表示该任务的 Future。该 Future 的 get 方法在成功 完成时将会返回 null。
	Future<?> submit(Runnable task);
}

 

六、java.util.concurrent.Callable<V>

/**
 * Callable<V>
 * 返回结果并且可能抛出异常的任务。实现者定义了一个不带任何参数的叫做 call 的方法
 * Callable 接口类似于 Runnable,两者都是为那些其实例可能被另一个线程执行的类设计的。但是 Runnable 不会返回结果,并且无法抛出经过检查的异常。
 * Executors 类包含一些从其他普通形式转换成 Callable 类的实用方法。
 */
public interface Callable<V>
{
	//计算结果,如果无法计算结果,则抛出一个异常
	V call()
       throws Exception;
}

 

七、java.util.concurrent.Future<V>

/**
 * Future<V>
 * V - 此 Future 的 get 方法所返回的结果类型
 * Future 表示异步计算的结果。
 * 它提供了检查计算是否完成的方法,以等待计算的完成,并获取计算的结果。
 * 计算完成后只能使用 get 方法来获取结果,如有必要,计算完成前可以阻塞此方法。
 * 取消则由 cancel 方法来执行。还提供了其他方法,以确定任务是正常完成还是被取消了。一旦计算完成,就不能再取消计算。
 * 如果为了可取消性而使用 Future 但又不提供可用的结果,则可以声明 Future<?> 形式类型、并返回 null 作为底层任务的结果。 
 */
public interface Future<V>
{
	/**
	 * 试图取消对此任务的执行。如果任务已完成、或已取消,或者由于某些其他原因而无法取消,则此尝试将失败。
	 * 当调用 cancel 时,如果调用成功,而此任务尚未启动,则此任务将永不运行。
	 * 如果任务已经启动,则 mayInterruptIfRunning 参数确定是否应该以试图停止任务的方式来中断执行此任务的线程。 
	 * mayInterruptIfRunning - 如果应该中断执行此任务的线程,则为 true;否则允许正在运行的任务运行完成 
	 */
	boolean cancel(boolean mayInterruptIfRunning);

	//如有必要,等待计算完成,然后获取其结果
	V get()
      throws InterruptedException,
             ExecutionException;

	V get(long timeout,
      TimeUnit unit)
      throws InterruptedException,
             ExecutionException,
             TimeoutException;

	//如果在任务正常完成前将其取消,则返回 true。 
	boolean isCancelled();

	//如果任务已完成,则返回 true。 可能由于正常终止、异常或取消而完成,在所有这些情况中,此方法都将返回 true
	boolean isDone();
}

 

分享到:
评论

相关推荐

    Java_API之jdk-7u51-apidocs

    3. **多线程**:Java 7的`java.util.concurrent`包提供了一套高效的并发工具,包括线程池、同步容器类和并发集合类。`Fork/Join`框架则允许将大任务分解为小任务并行执行,提高程序效率。 4. **网络编程**:`java...

    jdk11_api_jb51.rar

    `java.util.concurrent`包下新增了`ForkJoinPool.commonPool()`方法,允许更简单地使用Fork/Join框架,提高了多线程并行任务的执行效率。 ### 3. 类和接口 #### 3.1 新类 - `java.lang.Module`:表示模块系统的...

    JAVA API 1.80 中文版

    3. **并发编程**:`java.util.concurrent`,提供了线程安全的数据结构和并发工具类,如`ExecutorService`、`Future`和`Semaphore`,方便开发者进行多线程编程。 4. **IO流**:`java.io`,包含了输入/输出流的类,...

    java核心知识点整理.pdf

    25 JAVA8 与元数据.................................................................................................................................25 2.4. 垃圾回收与算法 .................................

    JAVA核心知识点整理(有效)

    25 JAVA8 与元数据.................................................................................................................................25 2.4. 垃圾回收与算法 .................................

    java SDK 类库详解

    - **java.util**:提供各种实用工具类,如集合框架、日期/时间API、随机数生成器等。 - **java.io**:处理输入输出操作,包括文件操作、流处理等。 - **java.net**:处理网络通信,如Socket编程、URL访问等。 - *...

    Java多线程技术精讲

    Java提供了一些工具来避免和检测死锁,例如java.util.concurrent包下的Lock接口和Condition接口,它们提供了更细粒度的锁控制,有助于减少死锁的可能性。 线程间通信是多线程编程中的另一个重要主题。Java提供了...

    java高级界面篇实例

    这个练习涉及多线程编程,可能是通过`Thread`类或者`java.util.concurrent`包中的并发工具。开发者将学习如何创建和管理并发任务,以及如何处理竞态条件和同步问题。 这些实例覆盖了Java GUI开发的广泛领域,从...

    Java SE完整版精品优质课件 自学入门必看的优秀Java基础知识培训教案 第07章_Java集合(共51页).rar

    8. **并发集合**:Java并发库(java.util.concurrent)提供了线程安全的集合实现,如ConcurrentHashMap、CopyOnWriteArrayList和ConcurrentLinkedQueue,它们在多线程环境下性能更优。 9. **流(Stream)API**:...

    ( Jdk1.7.zip )

    8. **Fork/Join框架**:这个框架用于实现并行任务,通过`java.util.concurrent.ForkJoinPool`和`java.util.concurrent.RecursiveAction`类来提升多核处理器上的性能。 9. **改进的垃圾回收**:JDK 7中的垃圾回收器...

    JDK1.7.0 sample

    `java.util.concurrent.ForkJoinPool`和`java.util.concurrent.RecursiveTask`是核心类。 6. **NIO.2**:JDK 1.7对非阻塞I/O(New I/O)进行了扩展,增加了许多新功能,如异步文件操作、文件属性查询、文件系统监控...

    jre1.6.0绿色版

    - **并发改进**:对`java.util.concurrent`包进行了扩展,增加了更多的并发工具类,如`ForkJoinPool`和`Phaser`,以支持并行计算。 - **枚举类型和注解**:1.6版本中,枚举已经成为一种强大的类型,可以拥有方法和...

    java面试题

    14. 简述synchronized和java.util.concurrent.locks.Lock的异同 ? 11 15. 当一个线程进入一个对象的一个synchronized方法后,其它线程是否可进入此对象的其它方法? 11 16. abstract class和interface有什么区别? 12...

    java的thread类重写run方法的双线程从1加到100

    但如果涉及共享资源,如全局变量,就需要使用同步机制,如`synchronized`关键字或`java.util.concurrent`包中的工具,来防止数据不一致。 总结来说,Java中的多线程通过继承`Thread`类或者实现`Runnable`接口来创建...

    java题库,超赞

    Lock是Java.util.concurrent包中的接口,提供了比synchronized更灵活的锁定机制。 55. 设计线程通常需要考虑线程安全和同步机制,以保证数据的一致性和线程的协调执行。 56. 线程循环的具体实现需要确保操作的原子性...

    Java面试宝典2017 下载 高清完整PDF版

    50. Java中有多种实现多线程的方式,包括实现Runnable接口、继承Thread类,同步的实现方法包括使用synchronized关键字和使用java.util.concurrent包下的工具类。 51. 启动线程使用start()方法,而不是run()方法。 ...

    Java面试宝典2013_PDF版.pdf

    synchronized是内置的Java语言关键字,Lock是java.util.concurrent.locks包下的一个接口。synchronized在执行完或者遇到异常时会自动释放锁,而Lock需要手动释放锁。Lock提供了更灵活的锁定策略,如尝试非阻塞地...

    java 2012面试题

    同步的实现方法有synchronized关键字和java.util.concurrent.locks包下的Lock接口。 51. 启动线程应该使用start()方法而不是run()方法,因为start()方法会创建新线程并调用run()方法,而run()方法仅是普通方法调用...

Global site tag (gtag.js) - Google Analytics