zoukankan      html  css  js  c++  java
  • Java基础知识(多线程和线程池)

    新建状态: 一个新产生的线程从新状态开始了它的生命周期。它保持这个状态直到程序 start 这个线程。

    运行状态:当一个新状态的线程被 start 以后,线程就变成可运行状态,一个线程在此状态下被认为是开始执行其任务

    就绪状态:当一个线程等待另外一个线程执行一个任务的时候,该线程就进入就绪状态。当另一个线程给就绪状态的线程发送信号时,该线程才重新切换到运行状态。

    休眠状态: 由于一个线程的时间片用完了,该线程从运行状态进入休眠状态。当时间间隔到期或者等待的时间发生了,该状态的线程切换到运行状态。

    终止状态: 一个运行状态的线程完成任务或者其他终止条件发生,该线程就切换到终止状态。

    new Thread()的缺点

    每次new Thread()耗费性能 
    调用new Thread()创建的线程缺乏管理,被称为野线程,而且可以无限制创建,之间相互竞争,会导致过多占用系统资源导致系统瘫痪。 
    不利于扩展,比如如定时执行、定期执行、线程中断

    采用线程池的优点

    重用存在的线程,减少对象创建、消亡的开销,性能佳 
    可有效控制最大并发线程数,提高系统资源的使用率,同时避免过多资源竞争,避免堵塞 
    提供定时执行、定期执行、单线程、并发数控制等功能

    线程池

    一、Java自带线程池

    Executor框架便是Java 5中引入的,通过Executor来启动线程比使用Thread的start方法更好;Executor框架包括:线程池,Executor,Executors,ExecutorService,CompletionService,Future,Callable等。

    Executors工厂类

    通过Executors提供四种线程池,newFixedThreadPool、newCachedThreadPool、newSingleThreadExecutor、newScheduledThreadPool。

    1.public static ExecutorService newFixedThreadPool(int nThreads) 
    创建固定数目线程的线程池。

     ExecutorService executorService = Executors.newFixedThreadPool(5);
            for (int i = 0; i < 20; i++) {
                Runnable syncRunnable = new Runnable() {
                    @Override
                    public void run() {
                        Log.e(TAG, Thread.currentThread().getName());
                    }
                };
                executorService.execute(syncRunnable);
            }

    2.public static ExecutorService newCachedThreadPool() 
    创建一个可缓存的线程池,调用execute将重用以前构造的线程(如果线程可用)。如果现有线程没有可用的,则创建一个新线 程并添加到池中。终止并从缓存中移除那些已有 60 秒钟未被使用的线程。

    3.public static ExecutorService newSingleThreadExecutor() 
    创建一个单线程化的Executor。

    4.public static ScheduledExecutorService newScheduledThreadPool(int corePoolSize) 
    创建一个支持定时及周期性的任务执行的线程池,多数情况下可用来替代Timer类。

    Executor执行Runnable任务

    一旦Runnable任务传递到execute()方法,该方法便会自动在一个线程上执行。

    Executor执行Callable任务

    在Java 5之后,任务分两类:一类是实现了Runnable接口的类,一类是实现了Callable接口的类。两者都可以被ExecutorService执行,但是Runnable任务没有返回值,而Callable任务有返回值。并且Callable的call()方法只能通过ExecutorService的submit(Callable task) 方法来执行,并且返回一个 Future,是表示任务等待完成的 Future。

    二、Spring线程池配置

    直接调用

    ThreadPoolTaskExecutor poolTaskExecutor = new ThreadPoolTaskExecutor();
    //线程池所使用的缓冲队列
    poolTaskExecutor.setQueueCapacity(200);
    //线程池维护线程的最少数量
    poolTaskExecutor.setCorePoolSize(5);
    //线程池维护线程的最大数量
    poolTaskExecutor.setMaxPoolSize(1000);
    //线程池维护线程所允许的空闲时间
    poolTaskExecutor.setKeepAliveSeconds(30000);
    poolTaskExecutor.initialize();

    通过配置文件

    <bean id="poolTaskExecutor" class="org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor">
    <!-- 核心线程数,默认为1 -->
    <property name="corePoolSize" value="5" />
    <!-- 最大线程数,默认为Integer.MAX_VALUE -->
    <property name="maxPoolSize" value="50" />
    <!-- 队列最大长度,一般需要设置值>=notifyScheduledMainExecutor.maxNum;默认为Integer.MAX_VALUE -->
    <property name="queueCapacity" value="2000" />
    <!-- 线程池维护线程所允许的空闲时间,默认为60s -->
    <property name="keepAliveSeconds" value="100" />
    <!-- 线程池对拒绝任务(无线程可用)的处理策略,目前只支持AbortPolicy、CallerRunsPolicy;默认为后者 -->
    <property name="rejectedExecutionHandler">
    <!-- AbortPolicy:直接抛出java.util.concurrent.RejectedExecutionException异常 -->
    <!-- CallerRunsPolicy:主线程直接执行该任务,执行完之后尝试添加下一个任务到线程池中,可以有效降低向线程池内添加任务的速度 -->
    <!-- DiscardOldestPolicy:抛弃旧的任务、暂不支持;会导致被丢弃的任务无法再次被执行 -->
    <!-- DiscardPolicy:抛弃当前任务、暂不支持;会导致被丢弃的任务无法再次被执行 -->
    <bean class="java.util.concurrent.ThreadPoolExecutor$CallerRunsPolicy" />
    </property>
    </bean>

  • 相关阅读:
    驱动程序细节和权衡
    交互
    查找UI元素
    Selenium-Webdriver API命令和操作-Get & Wait
    Selenium的webdriver
    openssl生成ssl证书
    tony_nginx_02_URL重写
    CPA
    消息队列产品比较
    元数据交换绑定的秘密
  • 原文地址:https://www.cnblogs.com/h-c-g/p/10391755.html
Copyright © 2011-2022 走看看