包: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."); } }
執行結果: