张亚洲 发表于 2015-1-6 08:40:44

【我分享】java并行执行多个任务

java并行执行多个任务:
最近做项目中,有个任务需要实现并发编程,个人参考了下网上的实现,自己实现了下并发方法,并且增加了简单的说明,希望的有需要的朋友有些帮助。

view plaincopy


[*] <pre code_snippet_id="202406" snippet_file_name="blog_20140224_1_9891540" name="code" class="java">import java.util.UUID;
[*]import java.util.concurrent.CountDownLatch;
[*]import java.util.concurrent.ExecutorService;
[*]import java.util.concurrent.Executors;
[*]
[*]/**
[*] * 测试监控类
[*] *
[*] * @author
[*] *
[*] */
[*]public class WatchThread {
[*]
[*]    private String name = UUID.randomUUID().toString();
[*]
[*]    /**
[*]   * 测试函数
[*]   *
[*]   * @throws InterruptedException
[*]   */
[*]    public void testThread() throws InterruptedException {
[*]      int threadNum = 10;
[*]      // 初始化countDown
[*]      CountDownLatch threadSignal = new CountDownLatch(threadNum);
[*]      // 创建固定长度的线程池
[*]//      Executor executor = Executors.newFixedThreadPool(threadNum);
[*]      //此处不可以用接口 需要使用Executor的实现类 ExecutorServiceExecutor未提供shutdown等方法
[*]      ExecutorService executor = Executors.newFixedThreadPool(threadNum);
[*]      for (int i = 0; i < threadNum; i++) { // 开threadNum个线程
[*]            Runnable task = new TestThread(threadSignal);
[*]            // 执行
[*]            executor.execute(task);
[*]
[*]      }
[*]      threadSignal.await(); // 等待所有子线程执行完
[*]      //固定线程池执行完成后 将释放掉资源 退出主进程
[*]      executor.shutdown();//并不是终止线程的运行,而是禁止在这个Executor中添加新的任务
[*]      // do work end
[*]      //退出主进程
[*]      System.out.println(Thread.currentThread().getName() + "+++++++结束.");
[*]    }
[*]
[*]    /**
[*]   * 测试函数
[*]   */
[*]    public static void main(String[] args) throws InterruptedException {
[*]      WatchThread test = new WatchThread();
[*]      test.testThread();
[*]    }
[*]
[*]    /**
[*]   *
[*]   * @author wangmuming
[*]   * 此可以做完内部类 也可以不做未内部类
[*]   * 作为内部类的时候 有一个好处 就是可以直接引用给类的主对象的成员变量 如此处的name
[*]   * 当然
[*]   */
[*]    private class TestThread implements Runnable {
[*]      private CountDownLatch threadsSignal;
[*]
[*]      public TestThread(CountDownLatch threadsSignal) {
[*]            this.threadsSignal = threadsSignal;
[*]      }
[*]
[*]
[*]      public void run() {
[*]            System.out.println(Thread.currentThread().getName() + "开始..." + name);
[*]            System.out.println("开始了线程::::" + threadsSignal.getCount());
[*]
[*]            // do shomething
[*]
[*]            //核心处理逻辑
[*]
[*]      //用到成员变量name作为参数
[*]
[*]            // 线程结束时计数器减1
[*]            threadsSignal.countDown();//必须等核心处理逻辑处理完成后才可以减1
[*]            System.out.println(Thread.currentThread().getName() + "结束. 还有"
[*]                  + threadsSignal.getCount() + " 个线程");
[*]      }
[*]    }
[*]
[*]}</pre><br>
[*]<pre></pre>
[*]<p></p>
[*]<pre></pre>
[*]<p>执行结果:</p>
[*]<p><br>
[*]</p>
[*]<p>pool-1-thread-1开始...aaa917dc-bd69-4438-9bb1-0051e5c62984<br>
[*]开始了线程::::10<br>
[*]pool-1-thread-1结束. 还有9 个线程<br>
[*]pool-1-thread-2开始...aaa917dc-bd69-4438-9bb1-0051e5c62984<br>
[*]开始了线程::::9<br>
[*]pool-1-thread-2结束. 还有8 个线程<br>
[*]pool-1-thread-3开始...aaa917dc-bd69-4438-9bb1-0051e5c62984<br>
[*]开始了线程::::8<br>
[*]pool-1-thread-3结束. 还有7 个线程<br>
[*]pool-1-thread-4开始...aaa917dc-bd69-4438-9bb1-0051e5c62984<br>
[*]pool-1-thread-5开始...aaa917dc-bd69-4438-9bb1-0051e5c62984<br>
[*]开始了线程::::7<br>
[*]开始了线程::::7<br>
[*]pool-1-thread-4结束. 还有6 个线程<br>
[*]pool-1-thread-5结束. 还有5 个线程<br>
[*]pool-1-thread-10开始...aaa917dc-bd69-4438-9bb1-0051e5c62984<br>
[*]开始了线程::::5<br>
[*]pool-1-thread-6开始...aaa917dc-bd69-4438-9bb1-0051e5c62984<br>
[*]pool-1-thread-9开始...aaa917dc-bd69-4438-9bb1-0051e5c62984<br>
[*]开始了线程::::4<br>
[*]pool-1-thread-9结束. 还有3 个线程<br>
[*]pool-1-thread-8开始...aaa917dc-bd69-4438-9bb1-0051e5c62984<br>
[*]开始了线程::::3<br>
[*]pool-1-thread-8结束. 还有2 个线程<br>
[*]pool-1-thread-7开始...aaa917dc-bd69-4438-9bb1-0051e5c62984<br>
[*]开始了线程::::2<br>
[*]pool-1-thread-7结束. 还有1 个线程<br>
[*]开始了线程::::4<br>
[*]pool-1-thread-10结束. 还有4 个线程<br>
[*]pool-1-thread-6结束. 还有0 个线程<br>
[*]main+++++++结束.<br>
[*]</p>
[*]<p></p>


页: [1]
查看完整版本: 【我分享】java并行执行多个任务