对于线程池的一些学习

ThreadPoolExecutor

线程池是什么,作用:线程池可以解决两个不同问题:由于减少了每个任务调用的开销,它们通常可以在执行大量异步任务时提供增强的性能,并且还可以提供绑定和管理资源(包括执行任务集时使用的线程)的方法。每个 ThreadPoolExecutor 还维护着一些基本的统计数据,如完成的任务数。

Thread与Runable的用法


class MyThread extends Thread {

String name;

int ticket=5;

public MyThread(String name) {

    this.name = name;
}

@Override
public void run() {

    for (int i = 0; i < 5; i++) {
        if(ticket>0){
            System.out.println("当前线程=" +Thread.currentThread().getName()+ "剩余票数=" + ticket--);
        }
    }
}

}

class MyRunnable implements Runnable {

int ticket=5;

public void run() {

    for (int i = 0; i < 5; i++) {
        if(ticket>0){
            System.out.println("当前线程=" +Thread.currentThread().getName()+ "剩余票数=" + ticket--);
        }

    }
}

}

public class MMMM {

public static void main(String[] args) {

    Thread thread1=new MyThread("a");

    Thread thread2=new MyThread("b");

    /*MyRunnable r=new MyRunnable();

    Thread thread1=new Thread(r,"a");

    Thread thread2=new Thread(r,"b");*/

    thread1.start();

    thread2.start();
}
/**
 * 总结:调用Thread的run方法,只会执行一个线程,调用start方法可以创建一个线程去执行run方法
 * 
 * 资源无法共享,线程资源独立
 * 
 * 拖过Runnable来实现资源共享,new一个Runnable类实例,通过Thread的strat方法执行Runnable的run方法
 * 
 * Thread的start启动一个线程,进入等待队列,run执行线程,
 * 
 * Runnable方法的run不创建线程
 * 
 * */
</php>

四大线程池

1.可缓存线程池 线程数无限制,有空闲线程复用,若无开启新线程,一定程序上减少创建,销毁线程,减少系统开销
ExecutorService cachedThreadPool= Executors.newCachedThreadPool();
2.定长线程池(并发线程池) 可控制线程最大并发数,超出线程会在队列中等待
ExecutorService fixedThreadPool=Executors.newFixedThreadPool(3);
3.定长线程池(周期性线程池) 定时周期性执行任务
ExecutorService scheduledThreadPool=Executors.newScheduledThreadPool(6);
4.单线程化的线程池 单次执行,按照顺序
ExecutorService singleThreadExecutor=Executors.newSingleThreadExecutor();

用法


// 缓存线程池:执行第二个线程时,第一个已经执行完毕,则复当前线程,节省开销
for(int i=0;i<10;i++){

        final int index=i;

        try {
            Thread.sleep(1000);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }

        cachedThreadPool.execute(new Runnable() {
            @Override
            public void run() {

                Log.i("mao","当前i="+index);
            }
        });
    }

    //定长线程池:同一时间执行最大并发线程,其余线程在队列中等待
    for(int i=0;i<10;i++){

        final int index=i;



        fixedThreadPool.execute(new Runnable() {
            @Override
            public void run() {

                Log.i("mao","当前i="+index);

                try {
                    Thread.sleep(1000);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
        });
    }


    //定长线程池:性延迟2秒后每三秒执行一次线程池
    for(int i=0;i<10;i++){

        final int index=i;

        scheduledThreadPool.scheduleAtFixedRate(new Runnable() {
            @Override
            public void run() {

                Log.i("mao","当前i="+index);
            }
        },2,3, TimeUnit.SECONDS);

    }


    //单线程化的线程池:顺序执行,只有一个工作线程在实行任务
    for(int i=0;i<10;i++){

        final int index=i;

        singleThreadExecutor.execute(new Runnable() {
            @Override
            public void run() {
                Log.i("mao","当前i="+index);
            }
        });

    }
</php>

看了两个多小时的线程和线程池快要吐了,我去,不过收获还是不小的,如果上面的内容对你有帮助,那就很开心了。有需要的可以留言,谢谢大家了。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值