线程(六)线程池

来源:互联网 发布:centos安装nginx 编辑:程序博客网 时间:2024/05/01 18:19
1.可重用的固定集合线程池,以共享的无界队列的方式来运行这些线程
ExecuterService threadPool = Executors.newFixedThreadPool(3);  //容纳固定的线程
这个线程就是创建一个固定大小的线程池,等待任务来的时候就取线程池中的线程进行任务的执行,这个的好处呢我们大家也是很容易明白的,就是实现创建好了几个线程,至于什么时候用就静待任务的到来了.这个就是我们线程池的基本思想了,我们实现准备好,你来了就直接执行,不需要来了再创建一个线程,这样的话是不是比较方便和节省时间呢,我们来看一下线程执行的效果把:
 * Created by luyangli on 16-6-29. */public class FiledThreadPollTest {    public static void main(String[] args) {        ExecutorService executorService = Executors.newFixedThreadPool(3);        for (int i=0; i<5; i++) {            final int threadId = i;            executorService.execute(new Runnable() {                @Override public void run() {                    for(int i=0; i<5; i++){                        try {                            Thread.sleep(1000);                        } catch (InterruptedException e) {                            e.printStackTrace();                        }                        System.out.println("任务:" + threadId + "执行了" + i + "");                    }                }            });        }    }}
我们来看一下执行结果:
任务:0执行了0次任务:1执行了0次任务:2执行了0次任务:0执行了1次任务:1执行了1次任务:2执行了1次任务:0执行了2次任务:1执行了2次任务:2执行了2次任务:0执行了3次任务:2执行了3次任务:1执行了3次任务:0执行了4次任务:2执行了4次任务:1执行了4次任务:3执行了0次任务:4执行了0次任务:3执行了1次任务:4执行了1次
我们可以看到的是,线程都是三三一对进行执行的,为什么呢,应为我们是启动了5个任务,每个任务执行5 次,那么三个线程池,肯定是占得满满的,每一次都是三个执行,然后线程执行前三个任务执行完毕之后在执行后面的2个任务
2.可在需要的时候创建一个新的线程,以前创建的线程可以重用

ExecuterService threadPool = Executor.newCachedThreadPool();  //需要的时候创建,可动态分配

这个线程池就是需要几个我们就开辟几个线程,然后一起执行,我们看一下

public class CatchThreadPollTest {    public static void main(String[] args) {        for (int i=1; i<=5; i++) {            ExecutorService catchThreasPoll = Executors.newCachedThreadPool();            final int threadId = i;            catchThreasPoll.execute(new Runnable() {                @Override public void run() {                    for(int i=0; i<5; i++){                        try {                            Thread.sleep(1000);                        } catch (InterruptedException e) {                            e.printStackTrace();                        }                        System.out.println("任务:" + threadId + "执行了" + i + "");                    }                }            });        }    }}
我们可以看到我们并没有执行开辟几个线程但是这个是需要几个我们就开辟几个 ,我们来看一下执行效果:
任务:1执行了0次任务:2执行了0次任务:3执行了0次任务:4执行了0次任务:5执行了0次任务:1执行了1次任务:2执行了1次任务:3执行了1次任务:4执行了1次任务:5执行了1次任务:2执行了2次任务:1执行了2次任务:3执行了2次任务:4执行了2次任务:5执行了2次任务:2执行了3次任务:1执行了3次任务:3执行了3次任务:4执行了3次任务:5执行了3次任务:2执行了4次任务:1执行了4次任务:3执行了4次任务:4执行了4次任务:5执行了4次
每次都是5个任务一起执行哦

3.创建一个单个工作线程的Executer,以无界队列方式运行该线程,
ExecuterService threadPool = Executor.newSingleThreadExecutor(); //创建一个线程的线程池,当当前线程执行任务中断的时候在创建一个新的线程来接着执行该任务

那么党我们需要一个线程执行的时候呢,就是是用这个SingleThreadExecutor线程池思想他呢会在任务中断的时候,重新开辟一个线程,继续接着上面的线程执行的.

 */public class SingleThreadPollTest {    public static void main(String[] args) {        ExecutorService executorService = Executors.newSingleThreadExecutor();        executorService.execute(new Runnable() {            @Override public void run() {                for (int i = 0; i < 5; i++) {                    try {                        Thread.sleep(1000);                    } catch (InterruptedException e) {                        e.printStackTrace();                    }                    while (i == 3) {                        System.out.println("抛出异常中断线程");                        try {                            throw new RuntimeException("抛出异常中断线程");                        } catch (Exception e) {                            i++;                        }                    }                    System.out.println("任务:" + Thread.currentThread().getName() + "执行了" + i + "");                }            }        });    }}
我们开辟了一个线程执行这个任务,当任务执行到第四边的时候这个线程中断了,按照我们的思想,这个线程池会在创建一个线程继续帮主我们执行完毕:
任务:pool-1-thread-1执行了0次任务:pool-1-thread-1执行了1次任务:pool-1-thread-1执行了2次抛出异常中断线程任务:pool-1-thread-1执行了4次
我们可以看到第三次是中断了,但是线程池马上又给我们启动了一个新的线程执行该任务了

4.创建一个可以安排给定时延时后的任务执行的线程池

ScheduleExecuterService threadPool = Executor.newScheduleThreadPool(3); 

还有一种就是执行定时任务的线程:

public class ScheduleThreadPollTest {    public static void main(String[] args) {        ScheduledExecutorService executorService = Executors.newScheduledThreadPool(1);        executorService.schedule(new Runnable() {            @Override public void run() {                System.out.println("任务:");            }        }, 5, TimeUnit.SECONDS);        executorService.scheduleAtFixedRate(new Runnable() {            @Override public void run() {                System.out.println("任务:");            }        }, 5, 2, TimeUnit.SECONDS);    }}
这个呢我们可以联想到我们的Timer和TimerTask


0 0
原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 鸡蛋和土豆吃了怎么办 狗狗眼睛流血水怎么办 石粉粘土干了怎么办 樱花针管笔干了怎么办 想学linux不会c语言怎么办 被摩托车排气管烫伤了怎么办 泡泡糖粘在衣服上怎么办 皮卡书屋办卡怎么办 照证件照齐刘海怎么办 哈挺机床卡刀了怎么办 绝地求生卡在登陆页面怎么办 白鞋子长霉了怎么办 幸福树树干烂了怎么办 花椒树树叶掉落枝干发黑怎么办 茉莉枝干变干了怎么办 冲风了头蒙怎么办 不小心把腰扭了怎么办 白衣服发霉有小黑点怎么办 佛肚竹的枝叶都枯了怎么办 山竹一天吃多了怎么办 水养竹子叶子发黄怎么办 龙竹的竹杆黄了怎么办 散尾竹叶子发黑怎么办 给姐姐打工不发工资怎么办? 水培红掌叶子发黄怎么办 盆竹的叶尖发黄怎么办 养富贵竹水里怎么生小虫怎么办 盆栽金银花叶子全部落掉怎么办 荷花竹根部烂了怎么办 水培绿萝叶子发黄怎么办 大早上的公鸡老打鸣怎么办 紫吊兰叶子变绿怎么办 芙桑花叶子发黄怎么办 长春花长得太高怎么办 四季梅叶子蔫了怎么办 吸财树叶子蔫了怎么办 民族团结手抄报间单有漂亮怎么办 鹦鹉尾巴毛掉了怎么办 羊绒衫领子打太大了怎么办 内裤洗了还有一股味道怎么办 月经下不来内裤上总有脏东西怎么办