当前位置:编程学习 > JAVA >>

Java小例子:创建和使用固定大小的线程池

Java 1.5 开始,提供了线程池供大家使用,功能还挺全的。下面是一个简单的例子。复杂的例子将放在后面几篇博客中。

import java.util.List;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.TimeUnit;
 
/**
 * 固定大小线程池
 *
 * @author yiding.he
 */
public class FixedThreadPoolDemo {
 
    public static void main(String[] args) {
        
        // 创建一个最多同时运行 3 个任务的线程池
        ExecutorService service = Executors.newFixedThreadPool(3);
       
        // 安排若干个任务运行
        service.execute(new RunnableImpl(1));
        service.execute(new RunnableImpl(2));
        service.execute(new RunnableImpl(3));
        service.execute(new RunnableImpl(4));
        service.execute(new RunnableImpl(5));
        service.execute(new RunnableImpl(6));
        service.execute(new RunnableImpl(7));
        service.execute(new RunnableImpl(8));
        service.execute(new RunnableImpl(9));
        service.execute(new RunnableImpl(10));
        service.execute(new RunnableImpl(11));
        service.execute(new RunnableImpl(12));
        service.execute(new RunnableImpl(13));
        service.execute(new RunnableImpl(14));
        service.execute(new RunnableImpl(15));
       
        // 结束线程池。shutdown() 不会马上结束,而是等所有安排的任务执行完才结束。
        service.shutdown();
       
        // 如果不想马上结束,又不愿意等太长时间,那么可以调用 awaitTermination() 方法等待一段时间
        try {
            service.awaitTermination(5, TimeUnit.SECONDS);
            System.err.println("等待时间已过");
           
            // shutdownNow() 将放弃所有正在等待的任务,等当前执行的任务全部完成之后,结束线程池。
            List<Runnable> abandoned = service.shutdownNow();
            System.err.println("被遗弃的任务:" + abandoned);
           
        } catch (InterruptedException e) {
            e.printStackTrace();
            System.exit(-1);
        }
    }
 
    /////////////////////////////////////////
 
    private static class RunnableImpl implements Runnable {
 
        private int id;
 
        private RunnableImpl(int id) {
            this.id = id;
        }
 
        public void run() {
            System.out.println("开始执行" + id);
 
            try {
                Thread.sleep(2000);
            } catch (InterruptedException e) {
                // nothing to do
            }
 
            System.out.println(id + "执行完毕。");
        }
 
        @Override
        public String toString() {
            return "线程" + id;
        }
    }
}

 

补充:软件开发 , Java ,
CopyRight © 2022 站长资源库 编程知识问答 zzzyk.com All Rights Reserved
部分文章来自网络,