前提条件:

1)在Eclipse创建一个Java项目,我取名为SpringThreadDemo。
2)项目所需的JAR包如图所示:
 
 

下面开始。
 

例子1:Spring结合Java线程。

通过继承Thread创建一个简单的Java线程,然后使用@Component让Spring容器管理此线程,Bean的范围必须是prototype,因此每个请求都会返回一个新实例,运行每个单独的线程。

PrintThread.java

 

package com.chszs.thread;  
  1.   
  2. import org.springframework.stereotype.Component;  
  3. import org.springframework.context.annotation.Scope;  
  4.   
  5. @Component  
  6. @Scope("prototype")  
  7. public class PrintThread extends Thread{  
  8.         @Override  
  9.         public void run(){  
  10.                 System.out.println(getName() + " is running.");  
  11.                 try{  
  12.                         Thread.sleep(5000);  
  13.                 }catch(InterruptedException e){  
  14.                         e.printStackTrace();  
  15.                 }  
  16.                 System.out.println(getName() + " is running again.");  
  17.         }  
  18. }  


 

AppConfig.java

 

 

package com.chszs.config;  
  1.   
  2. import org.springframework.context.annotation.ComponentScan;  
  3. import org.springframework.context.annotation.Configuration;  
  4.   
  5. @Configuration  
  6. @ComponentScan(basePackages="com.chszs.thread")  
  7. public class AppConfig {  
  8. }  

App.java

 

 

package com.chszs;  
  1. import org.springframework.context.ApplicationContext;  
  2. import org.springframework.context.annotation.AnnotationConfigApplicationContext;  
  3.   
  4. import com.chszs.config.AppConfig;  
  5. import com.chszs.thread.PrintThread;  
  6.   
  7. public class App {  
  8.         public static void main(String[] args){  
  9.                 ApplicationContext ctx =   
  10.             new AnnotationConfigApplicationContext(AppConfig.class);  
  11.                 PrintThread printThread1 = (PrintThread)ctx.getBean("printThread");  
  12.                 printThread1.setName("Thread 1");  
  13.                   
  14.                 PrintThread printThread2 = (PrintThread)ctx.getBean("printThread");  
  15.                 printThread2.setName("Thread 2");  
  16.                   
  17.                 PrintThread printThread3 = (PrintThread)ctx.getBean("printThread");  
  18.                 printThread3.setName("Thread 3");  
  19.                   
  20.                 PrintThread printThread4 = (PrintThread)ctx.getBean("printThread");  
  21.                 printThread4.setName("Thread 4");  
  22.                   
  23.                 PrintThread printThread5 = (PrintThread)ctx.getBean("printThread");  
  24.                 printThread5.setName("Thread 5");  
  25.                   
  26.                 printThread1.start();  
  27.                 printThread2.start();  
  28.                 printThread3.start();  
  29.                 printThread4.start();  
  30.                 printThread5.start();  
  31.         }  
  32. }  


 

输出:

Thread 1 is running.
Thread 2 is running.
Thread 4 is running.
Thread 5 is running.
Thread 3 is running.
Thread 2 is running again.
Thread 1 is running again.
Thread 5 is running again.
Thread 4 is running again.
Thread 3 is running again.

 


 

例子2:Spring线程池结合非Spring托管Bean。

 

使用Spring的ThreadPoolTaskExecutor类创建一个线程池。执行线程无需受Spring容器的管理。

 

PrintTask.java

 

 

package com.chszs.thread;  
  1.   
  2. public class PrintTask implements Runnable{  
  3.         String name;