`

java多线程 -- 线程的构架(线程池)

阅读更多
    import java.util.concurrent.Callable;  
    import java.util.concurrent.ExecutionException;  
    import java.util.concurrent.ExecutorService;  
    import java.util.concurrent.Executors;  
    import java.util.concurrent.Future;  
    import java.util.concurrent.ScheduledExecutorService;  
    import java.util.concurrent.TimeUnit;  
      
    /** 
     * 在Java 5.0之前启动一个任务是通过调用Thread类的start()方法来实现的, 
     * 任务的提于交和执行是同时进行的,如果你想对任务的执行进行调度, 
     * 或是控制同时执行的线程数量就需要额外编写代码来完成。 
     * 5.0里提供了一个新的任务执行架构使你可以轻松地调度和控制任务的执行, 
     * 并且可以建立一个类似数据库连接池的线程池来执行任务。 
     * 这个架构主要有三个接口和其相应的具体类组成。 
     * 这三个接口是Executor, ExecutorService和ScheduledExecutorService。 
     * (1)Executor接口:是用来执行Runnable任务的,它只定义一个方法: 
     * execute(Runnable command):执行Ruannable类型的任务 
     * (2)ExecutorService:继承了Executor的方法,并提供了执行Callable任务和中止任务执行的服务, 
     * 其定义的方法主要有: 
     * submit(task):可用来提交Callable或Runnable任务,并返回代表此任务的Future对象  
     * invokeAll(collection of tasks):批处理任务集合,并返回一个代表这些任务的Future对象集合  
     * shutdown():在完成已提交的任务后关闭服务,不再接受新任务  
     * shutdownNow():停止所有正在执行的任务并关闭服务。  
     * isTerminated():测试是否所有任务都执行完毕了。  
     * isShutdown():测试是否该ExecutorService已被关闭 
     * (3)ScheduledExecutorService:继承ExecutorService,提供了按时间安排执行任务的功能、 
     * schedule(task, initDelay): 安排所提交的Callable或Runnable任务在initDelay指定的时间后执行。 
     * scheduleAtFixedRate():安排所提交的Runnable任务按指定的间隔重复执行  
     * scheduleWithFixedDelay():安排所提交的Runnable任务在每次执行完后,等待delay所指定的时间后重复执行。 
     *  
     * 通过Executors类来获得各种服务对象。 
     * callable(Runnable task): 将Runnable的任务转化成Callable的任务  
     * newSingleThreadExecutor: 产生一个ExecutorService对象,这个对象只有一个线程可用来执行任务,若任务多于一个,任务将按先后顺序执行。  
     * newCachedThreadPool(): 产生一个ExecutorService对象,这个对象带有一个线程池,线程池的大小会根据需要调整,线程执行完任务后返回线程池,供执行下一次任务使用。 
     * newFixedThreadPool(int poolSize):产生一个ExecutorService对象,这个对象带有一个大小为poolSize的线程池,若任务数量大于poolSize,任务会被放在一个queue里顺序执行。  
     * newSingleThreadScheduledExecutor:产生一个ScheduledExecutorService对象,这个对象的线程池大小为1,若任务多于一个,任务将按先后顺序执行。  
     * newScheduledThreadPool(int poolSize): 产生一个ScheduledExecutorService对象,这个对象的线程池大小为poolSize,若任务数量大于poolSize,任务会在一个queue里等待执行  
     */  
    public class ExecuteArch {  
          
        /** 
         * 该线程输出一行字符串 
         */  
        public static class MyThread implements Runnable {  
            public void run() {  
                System.out.println("Task repeating. " + System.currentTimeMillis());  
                try {  
                    Thread.sleep(1000);  
                } catch (InterruptedException e) {  
                    System.out.println("Task interrupted. "  
                            + System.currentTimeMillis());  
                }  
            }  
        }  
      
        /** 
         * 该Callable结束另一个任务 
         */  
        public static class MyCallable implements Callable {  
            private Future future;  
      
            public MyCallable(Future future) {  
                this.future = future;  
            }  
      
            public String call() {  
                System.out.println("To cancell Task..."  
                        + +System.currentTimeMillis());  
                this.future.cancel(true);  
                return "Task cancelled!";  
            }  
        }  
      
        /** 
         * @param args 
         * @throws ExecutionException  
         * @throws InterruptedException  
         */  
        public static void main(String[] args) throws InterruptedException,  
                ExecutionException {  
            // 产生一个ExecutorService对象,这个对象带有一个线程池,线程池的大小会根据需要调整,  
            // 线程执行完任务后返回线程池,供执行下一次任务使用。  
            ExecutorService cachedService = Executors.newCachedThreadPool();  
            Future myThreadFuture = cachedService.submit(new MyThread());  
            Future myCallableFuture = cachedService.submit(new MyCallable(  
                    myThreadFuture));  
            System.out.println(myCallableFuture.get());  
            System.out.println("-----------------");  
      
            // 将Runnable任务转换成Callable任务  
            Callable myThreadCallable = Executors.callable(new MyThread());  
            Future myThreadCallableFuture = cachedService.submit(myThreadCallable);  
            // 对于Runnable任务,转换成Callable任务后,也没有返回值  
            System.out.println(myThreadCallableFuture.get());  
            cachedService.shutdownNow();  
            System.out.println("-----------------");  
      
            // 产生一个ExecutorService对象,这个对象带有一个大小为poolSize的线程池,  
            // 若任务数量大于poolSize,任务会被放在一个queue里顺序执行  
            ExecutorService fixedService = Executors.newFixedThreadPool(2);  
            fixedService.submit(new MyThread());  
            fixedService.submit(new MyThread());  
            // 由于线程池大小为2,所以后面的任务必须等待前面的任务执行完后才能被执行。  
            myThreadFuture = fixedService.submit(new MyThread());  
            myCallableFuture = fixedService.submit(new MyCallable(myThreadFuture));  
            System.out.println(myCallableFuture.get());  
            fixedService.shutdownNow();  
            System.out.println("-----------------");  
      
            // 产生一个ScheduledExecutorService对象,这个对象的线程池大小为poolSize,  
            // 若任务数量大于poolSize,任务会在一个queue里等待执行  
            ScheduledExecutorService fixedScheduledService = Executors  
                    .newScheduledThreadPool(2);  
            // 新建任务1  
            MyThread task1 = new MyThread();  
            // 使用任务执行服务立即执行任务1,而且此后每隔2秒执行一次任务1。  
            myThreadFuture = fixedScheduledService.scheduleAtFixedRate(task1, 0, 2,  
                    TimeUnit.SECONDS);  
            // 新建任务2  
            MyCallable task2 = new MyCallable(myThreadFuture);  
            // 使用任务执行服务等待5秒后执行任务2,执行它后会将任务1关闭。  
            myCallableFuture = fixedScheduledService.schedule(task2, 5,  
                    TimeUnit.SECONDS);  
            System.out.println(myCallableFuture.get());  
            fixedScheduledService.shutdownNow();  
        }  
    }  

 

1
1
分享到:
评论

相关推荐

    java-构架宝典2020513.doc

    2. 线程复用问题:在使用线程池时,如果不清理ThreadLocal,可能导致副本信息在不同任务间共享,产生意外结果。 ### Spring 事务管理 Spring 提供了一种声明式事务管理方式,它并不直接管理事务,而是定义了事务...

    模拟QQ(java实现)

    这个项目不仅涵盖了基础的Java编程,还深入到网络通信、多线程、数据库交互等多个核心领域,是提升Java开发技能和理解网络应用的良好实践。 首先,该项目涉及到Java编程基础,包括面向对象的设计原则、类与对象的...

    java 高手真经

    1. 并发控制:使用synchronized、Lock等机制保证多线程环境下的数据安全。 2. 缓存策略:使用本地缓存、分布式缓存减少数据库访问,提高性能。 3. 线程池:合理配置线程池大小,避免频繁创建销毁线程带来的开销。 4....

    从Jetty、Tomcat和Mina中提炼NIO构架网络服务器的经典模式

    3. **处理请求**:为了防止业务处理阻塞Selector,使用多线程分离监听和处理任务,最大化利用NIO的异步特性。 接下来是Tomcat的NIO实现: 1. **NioEndpoint**:同样负责组件的组合,包括Acceptor和Poller。 2. **...

    企业级构架

    线程池管理、锁机制和并发控制则是优化多线程应用性能的重要手段。 安全是企业级构架中的重要组成部分。包括用户认证、授权、加密、防止SQL注入和XSS攻击等,这些都需要精心设计和实施。同时,架构要考虑灾难恢复和...

    个人学习资料集锦 包括并发编程、架构实践等。

    Java并发编程是多线程环境下编写高效、稳定代码的关键技术。它包括了线程的创建与管理、同步机制(如synchronized、Lock)、并发容器(如ConcurrentHashMap、BlockingQueue)以及线程池(ExecutorService)等内容。...

    jetty 6 指南书

    - **Server和ThreadPool**:Server是Jetty的中心,ThreadPool用于管理线程。 4. **Jetty 服务配置文件** - **jetty.xml示例剖析**:展示了如何通过XML配置Jetty的各种设置。 - **Jetty XML Configuration语法**...

Global site tag (gtag.js) - Google Analytics