Spring 結合線程池實現 三種例子 注解應用 細品


 

包:spring的包都加上:

 

 

例子一:

用@Component讓Spring容器管理此線程,Bean的范圍必須是prototype,因此每個請求都會返回一個新實例,運行每個單獨的線程

package com.adao.spring.config;

import org.springframework.context.ApplicationContext;
import org.springframework.context.annotation.AnnotationConfigApplicationContext;

public class App1 {
    static ApplicationContext ctx = new AnnotationConfigApplicationContext(AppConfig.class);
    public static void main(String[] args) {
        
        PrintThread printThread1 = (PrintThread) ctx.getBean("printThread");
        printThread1.setName("Thread 1");

        PrintThread printThread2 = (PrintThread) ctx.getBean("printThread");
        printThread2.setName("Thread 2");

        PrintThread printThread3 = (PrintThread) ctx.getBean("printThread");
        printThread3.setName("Thread 3");

        PrintThread printThread4 = (PrintThread) ctx.getBean("printThread");
        printThread4.setName("Thread 4");

        PrintThread printThread5 = (PrintThread) ctx.getBean("printThread");
        printThread5.setName("Thread 5");

        printThread1.start();
        printThread2.start();
        printThread3.start();
        printThread4.start();
        printThread5.start();
    }
}
package com.adao.spring.config;

import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;

@Configuration  
@ComponentScan(basePackages="com.adao.spring.config")  
public class AppConfig {  
} 
package com.adao.spring.config;

import org.springframework.context.annotation.Scope;
import org.springframework.stereotype.Component;

@Component  
@Scope("prototype")  
public class PrintThread extends Thread{  
        @Override  
        public void run(){  
                System.out.println(getName() + " is running.");  
                try{  
                        Thread.sleep(5000);  
                }catch(InterruptedException e){  
                        e.printStackTrace();  
                }  
                System.out.println(getName() + " is running again.");  
        }  
}  

執行結果:

 

 

例子二: XML配置形式的線程池

Spring-Config.xml:

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xmlns:context="http://www.springframework.org/schema/context"
    xsi:schemaLocation="http://www.springframework.org/schema/beans  
        http://www.springframework.org/schema/beans/spring-beans-3.1.xsd  
        http://www.springframework.org/schema/context  
        http://www.springframework.org/schema/context/spring-context-3.1.xsd">

    <!-- 包路徑掃描 -->
    <context:component-scan base-package="com.adao.spring.xmlconfig" />

    <!-- Spring線程池 -->
    <bean id="taskExecutor"
        class="org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor">
        <!-- 核心線程數 -->
        <property name="corePoolSize" value="5" />
        <!-- 線程池維護線程的最大數量 -->
        <property name="maxPoolSize" value="10" />
        <!-- 允許的空閑時間, 默認60秒 -->
        <property name="keepAliveSeconds" value="60" />
        <!-- 任務隊列 -->
        <property name="queueCapacity" value="50" />
        <!-- 線程超過空閑時間限制,均會退出直到線程數量為0 -->
        <property name="allowCoreThreadTimeOut" value="true" />
        <property name="WaitForTasksToCompleteOnShutdown"
            value="true" />
        <!-- 對拒絕task的處理策略 -->
        <property name="rejectedExecutionHandler">
            <bean class="java.util.concurrent.ThreadPoolExecutor.DiscardOldestPolicy" />
        </property>
    </bean>

</beans>  
package com.adao.spring.xmlconfig;

import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
import org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor;

public class App2 {

    public static void main(String[] args) {
        ApplicationContext ctx = new ClassPathXmlApplicationContext("Spring-Config.xml");
        ThreadPoolTaskExecutor taskExecutor = (ThreadPoolTaskExecutor) ctx.getBean("taskExecutor");
        taskExecutor.execute(new PrintTask("Thread 1"));
        taskExecutor.execute(new PrintTask("Thread 2"));
        taskExecutor.execute(new PrintTask("Thread 3"));
        taskExecutor.execute(new PrintTask("Thread 4"));
        taskExecutor.execute(new PrintTask("Thread 5"));
        // 檢查活動的線程,如果活動線程數為0則關閉線程池
        for (;;) {
            int count = taskExecutor.getActiveCount();
            System.out.println("Active Threads : " + count);
            try {
                Thread.sleep(1000);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            if (count == 0) {
                taskExecutor.shutdown();
                break;
            }
        }
    }

}
package com.adao.spring.xmlconfig;
// runnable形式
public class PrintTask implements Runnable{  
    String name;  
    public PrintTask(String name){  
            this.name = name;  
    }  
    @Override  
    public void run() {  
            System.out.println(name + " is running.");  
            try{  
                    Thread.sleep(5000);  
            }catch(InterruptedException e){  
                    e.printStackTrace();  
            }  
            System.out.println(name + " is running again.");  
    }  
      
}  

執行結果;

 

 例子三: Spring線程池結果Bean

package com.adao.spring.bean;

import org.springframework.context.ApplicationContext;
import org.springframework.context.annotation.AnnotationConfigApplicationContext;
import org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor;

public class App3 {
    static ApplicationContext ctx = new AnnotationConfigApplicationContext(AppConfig.class);
    public static void main(String[] args) {
        
        ThreadPoolTaskExecutor taskExecutor = (ThreadPoolTaskExecutor) ctx.getBean("taskExecutor");

        PrintTask2 printTask1 = (PrintTask2) ctx.getBean("printTask2");
        printTask1.setName("Thread 1");
        taskExecutor.execute(printTask1);

        PrintTask2 printTask2 = (PrintTask2) ctx.getBean("printTask2");
        printTask2.setName("Thread 2");
        taskExecutor.execute(printTask2);

        PrintTask2 printTask3 = (PrintTask2) ctx.getBean("printTask2");
        printTask3.setName("Thread 3");
        taskExecutor.execute(printTask3);

        for (;;) {
            int count = taskExecutor.getActiveCount();
            System.out.println("Active Threads : " + count);
            try {
                Thread.sleep(1000);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            if (count == 0) {
                taskExecutor.shutdown();
                break;
            }
        }
    }

}
package com.adao.spring.bean;

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;
import org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor;

@Configuration  
@ComponentScan(basePackages="com.adao.spring.bean")  
public class AppConfig {  
        @Bean  
        public ThreadPoolTaskExecutor taskExecutor(){  
                ThreadPoolTaskExecutor pool = new ThreadPoolTaskExecutor();  
                pool.setCorePoolSize(5);  
                pool.setMaxPoolSize(10);  
                pool.setWaitForTasksToCompleteOnShutdown(true);  
                return pool;  
        }  
} 
package com.adao.spring.bean;

import org.springframework.context.annotation.Scope;
import org.springframework.stereotype.Component;

@Component  
@Scope("prototype")  
public class PrintTask2 implements Runnable {  
        String name;  
  
        public void setName(String name) {  
                this.name = name;  
        }  
          
        @Override  
        public void run(){  
                System.out.println(name + " is running.");  
                try{  
                        Thread.sleep(5000);  
                }catch(InterruptedException e){  
                        e.printStackTrace();  
                }  
                System.out.println(name + " is running again.");  
        }  
}  

執行結果:

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM