
前言
Springt通过任涡芶skExecutor)来推动多线程和并发编程。使用ThreadPoolTaskExecutor可实现一岗线程池的TaskExecutor。而实际开发中任毋是非阻碍的,即异步的,所以我们应在配置类中借助@EnableAsync 开旗步任围持,并借助实际执行Bean的方式中使用@Async注解来声们一附任?p>
基于springboot的多线程程孝过程中,由于原本也必须注入spring容菩管理,才能发挥springboot的优势。所以这篇文字置来记录开发中它们结合时必须留意的一些事项。
注意事项

第一步我们把线程类的例子注入sping容菩管理
@Configuration
@SpringBootApplication
@Import({ThreadConfig.class})
public class ThreadApp implements CommandLineRunner
{
public static void main(String[] args) throws Exception {
ApplicationContext app = SpringApplication.run(ThreadApp .class, args);
//这里郑存上下文对淆,需要加上。SpringBootUtils类网上很多,可以自己搜下
SpringBootUtils.setApplicationContext(app);
}
//access command line arguments
@Override
public void run(String... args) throws Exception {
//do something
}
}
//ComponentScan注解会扫描com.demo.thead下,也就是多线程类所在的包下的文件
@Configuration
@ComponentScan(basePackages = { "com.demo.thread"})
public class ThreadConfig{
}
这里使用springboot @Import 注解,把ThreadConfig里扫描到的包中带注释的样例,如@Component等注入至spring容菩.
然哼程的片这里在我的业伟中有两种情?strong>

1、程行时,自动苹
这在通常的能执行程墟,当然可以直接在main函数里执行通过代码七程。但在springboot中spring 多线程,我们可以使用@PostConstruct注解的方法,让早已注入bean容七程对?p>
@Component
public class demoThread extends Thread
{
//注意这里,如果你没有实现把多线程类的实例注入到spring容片这里你是无法拿到其他自动装配的对淆的的,这也是我们第一步的意义所在。
@Autowired
private XxxService xxxService;
@PostConstruct
public void start() {
super.start();
}
public void run() {
// Ok,在这里你就可以实现线程要实现的功能逻辑了,自然也可以直接使用装配好的sevice对淆。
}
}
2、在程鞋需要开铺时片包括在从kafka接收数据,开铺处理,当然这些情坎需要借助第一步,把线程类实例注入到sping容?p>

private TaskThread thread;
private ExecutorService taskPool= new ThreadPoolExecutor(
5, 10, 1000,
TimeUnit.MILLISECONDS, new ArrayBlockingQueue<>(10),
new ThreadPoolExecutor.CallerRunsPolicy());
@KafkaListener(topics = "xxTopic")
public void receive(ConsumerRecord<Object, Object> consumerRecord) {
JSONObject json = JSON.parseObject(consumerRecord.value().toString());
//通过SpringBootUtils贿程类的实例
thread = SpringBootUtils.getBean(TaskThread.class);
//七程
//new Thread(thread).start() ;
//咸对汐值
thread.init(i);
//放入线程池执行
taskPool.execute(thread);
}
//注意这里是酚@Scope("prototype")注解
@Component
@Scope("prototype")
public class TaskThread implements Runnable{
protected int value=0;
@Autowired
private XxxService xxxService;
//ThreadLocal 对膝例模式下可以保证成员变量的线程安全和独立性。
public ThreadLocal<Integer> valueLocal = new ThreadLocal < Integer > () {
@Override
protected Integer initialValue() {
return 0;
}
};
protected static final Logger LOG = LoggerFactory.getLogger(GpsTaskThread.class);
@Override
public final void run() {
try {
LOG.info(value+"");
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
public void init(int Value) {
this.value=Value;
}
}
在这里我们必须注意,TaskThread这柑类在spirngboot中是讽加@Scope("prototype")注解设置为多例模式而是默认单例方式。
在单例方式下SpringBootUtils.getBean(TaskThread.class) 每次返回的都是同一镐然不需要每次都创建新的对汐无法确保成员函数的轮询安全spring 多线程,也就是说程池中的执行的轮询,它们的value值是共享的。而多例方式下,由于经常建立的都是一改线程对湘在上殊。

所以在这里请储意无论是我里面的样例代码而是平常的web开发中,spirngboot默认为单例方式,自定义的成员函数是泛型不安全的,需要借助ThreadLocal 讳他方式捉处理。
回到我们当前的业伟,在这里我们必须每柑处理的value值不同,互不影响,那么通过@Scope("prototype")注解把TaskThread设置为多例模式。
总结
通过里面的样例,我们可以提到springboot与多线程的结合抑或比较棘通过配置,我们又可以在spring容栖理线程类,也可以程中使用sping容颇对淆。同时我们在使用的过程当中要有意识的去留意线程安全方面的弊端和外部运行模式的弊端。当然这里理解的而是非常简单,如果有不恰当的地方还请锤常涵。
好了,以上就是这篇文章的全部内容了,希望本文的内容对茨学习护仔一定的参考学习价值,如果有疑问瓷以粱粱谢丛脚本之家的支持。
本文来自电脑杂谈,转载请注明本文网址:
http://www.pc-fly.com/a/jisuanjixue/article-136267-1.html
中国就这样了
肯定是这只学生放入去的
且有最新式速射炮