黑马程序员技术交流社区

标题: 分享一下对线程池的使用 [打印本页]

作者: 冯佩    时间: 2013-2-18 11:03
标题: 分享一下对线程池的使用
package thread;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
public class ExecutorDemo
{
     public static void main(String[] args)
    {
         //创建一个线程池来并发执行三个任务
         ExecutorService executor = Executors.newFixedThreadPool(3);
         //将要执行的任务提交给线程池的执行器。
         executor.execute(new PrintChar('a',100));
         executor.execute(new PrintChar('b',100));
         executor.execute(new PrintNum(100));
        //关闭执行器,之后便不能再接受新的任务。
        executor.shutdown();
    }
}
class PrintChar implements Runnable
{
    private char charToPrint;
    private int times;
    public PrintChar(char c,int t)
    {
       charToPrint = c;
       times = t;
    }
    public void run()
    {
       for(int i=0;i<times;i++)
       {
            System.out.println(charToPrint);
        }
    }
}
class PrintNum implements Runnable
{
     private int lastNum;
     public PrintNum(int n)
    {
     lastNum = n;
    }
    public void run()
    {
         for(int i=0;i<=lastNum;i++)
        {
            System.out.println(" "+i);
         }
    }
}
/*
毕老师在讲线程的等待唤醒机制时,提到了线程池的概念,在此分享下线程池的使用,
我们之前学习的都是执行单任务的多线程,当要执行多任务的时候,再用单任务的方式去
处理就比较低效了。而线程池则是管理并发执行多个任务的理想方法。

java提供Eexutor接口来执行线程池中的任务,提供ExecutorService接口来管理
和控制任务,ExecutorService是Executor的子接口。可使用Executors类中的静态方法
来创建Excutor对象,newFixedThreadPool(int)方法在线程池中创建固定数目的线程。
如果线程完成了任务的执行,它可以被重新使用以执行另外一个任务。如果线程池中所有的线程
都不处于空闲状态,且有任务在等待执行,此时如果由于一个错误终止了一个线程,就会创建
一个新线程来替代它。

ExecutorService executor = Executors.newFixedThreadPool(3);在代码中表示执行器
创建三个线程来并发执行三个任务。若改为ExecutorService executor = Executors.newFixedThreadPool(1);
此时这三个可运行的任务将顺序执行,因为在线程池中只有一个线程。若改为ExecutorService executor = Executors.newFixedThreadPool();
则是为每个等待的任务创建一个新线程,此时所有的任务都并发执行。

为一个任务创建一个线程,用Thread类。若要为多个任务创建线程,最好使用线程池。


*/





欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2