第一种方式:线程对象和线程对象里持有的对象引用都交给Spring管理。
线程定义:
public class MyThread1 extends Thread { private User user; public void run() { for (int i = 0; i < 10; i++) { System.out.println("i=" + i + "---->" + user + "--->" + this.getName()); } } public User getUser() { return user; } public void setUser(User user) { this.user = user; } }
配置文件内容:
<bean id="thread" class="com.ec.spring.ioc.thread.MyThread1" <span style="color:#FF0000;">scope="prototype"</span> > <property name="user" ref="user"/> </bean> <bean id="user" class="com.ec.spring.ioc.thread.User" scope="prototype"> </bean>测试代码:
public class ThreadTestOne { private DefaultListableBeanFactory factory; @Before public void init(){ factory = new DefaultListableBeanFactory(); XmlBeanDefinitionReader reader = new XmlBeanDefinitionReader(factory); reader.loadBeanDefinitions("applicationContext-ioc.xml"); } @Test public void testThread(){ Thread thread = factory.getBean("thread",MyThread1.class); thread.start(); } @Test public void testPrototype(){ for(int i=0;i<10;i++){ User user = factory.getBean("user",User.class); System.out.println(user); } } }
第二种方式,通过Spring的线程池对象ThreadPoolTaskExecutor来管理。
线程定义:
public class MyThread2 implements Runnable { private String name; public MyThread2() { } public MyThread2(String name){ this.name = name; } public void run() { for(int i=0 ;i < 10;i++){ System.out.println("thread = " + name ); } } }
<bean id="taskExecutor" class="org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor"> <property name="corePoolSize" value="5" /> <property name="maxPoolSize" value="10" /> <property name="WaitForTasksToCompleteOnShutdown" value="true" /> </bean>测试代码:
public class ThreadTestTwo { private DefaultListableBeanFactory factory; @Before public void init(){ factory = new DefaultListableBeanFactory(); XmlBeanDefinitionReader reader = new XmlBeanDefinitionReader(factory); reader.loadBeanDefinitions("applicationContext-ioc.xml"); } @Test public void testThreadPool(){ ThreadPoolTaskExecutor taskExecutor = (ThreadPoolTaskExecutor)factory.getBean("taskExecutor"); taskExecutor.execute(<span style="font-family:SimHei;color:#FF0000;">new MyThread2("thread1")</span>); taskExecutor.execute(<span style="color:#FF0000;">new MyThread2("thread2")</span>); taskExecutor.execute(<span style="color:#FF0000;">new MyThread2("thread3")</span>); } }
线程代码:
public class MyThread3 implements Runnable { public void run() { for(int i=0 ;i < 10;i++){ System.out.println("thread = " + this ); } } }
<bean id="taskExecutor" class="org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor"> <property name="corePoolSize" value="5" /> <property name="maxPoolSize" value="10" /> <property name="WaitForTasksToCompleteOnShutdown" value="true" /> </bean> <bean id="thread3" class="com.ec.spring.ioc.thread.MyThread3"></bean>
public class ThreadTestThree { private DefaultListableBeanFactory factory; @Before public void init(){ factory = new DefaultListableBeanFactory(); XmlBeanDefinitionReader reader = new XmlBeanDefinitionReader(factory); reader.loadBeanDefinitions("applicationContext-ioc.xml"); } @Test public void testThreadPool(){ ThreadPoolTaskExecutor taskExecutor = (ThreadPoolTaskExecutor)factory.getBean("taskExecutor"); taskExecutor.execute(<span style="color:#FF0000;"><strong>(MyThread3)factory.getBean("thread3")</strong></span>); taskExecutor.execute(<span style="color:#FF0000;"><strong>(MyThread3)factory.getBean("thread3")</strong></span>); taskExecutor.execute(<strong><span style="color:#FF0000;">(MyThread3)factory.getBean("thread3")</span></strong>); } }