当前位置:首页>开发>正文

Java多线程MasterWorker模式如何在高并发情况下优化 java多线程的情况下如何进行调试

2023-04-15 08:51:33 互联网 未知 开发

 Java多线程MasterWorker模式如何在高并发情况下优化 java多线程的情况下如何进行调试

Java多线程MasterWorker模式如何在高并发情况下优化

你说的Master指的是java的线程池吧,我之前做过一个项目,因为项目在内网拿不出来,我给你说一下我那次的经验。
几个关键点:
1、java线程池:使用java提供的ThreadPoolExecutor类构造主池,再构造一个辅池(辅池的作用在于当主池进入拒绝策略的时候,可以启动辅池,帮助主池分担一部分线程,或者在主池shutdown的瞬间又有任务进来,也会走到拒绝策略,此时可以启动辅池处理这些线程,一般情况下辅池不会启动),排队策略使用LinkedBlockingQueue队列。
2、单例模式:利用spring的IOC容器的单例性,每次取线程池时,从IOC容器中注入。创建一个组件类BatPool(spring组件默认为单例),里面再使用单例模式创建线程池,单例中的单例,保证单例性:
@Component

class BatPool{
private ThreadPoolExecutor mainPool
ThreadPoolExecutor create(){
if(mainPool== null){
   retrun new ThreadPoolExecutor()
}else{
 retrun mainPool
}
...
}
业务中:

@Autowired

BatPool batPool
ThreadPoolExecutor pool = batPool.create()
...
线程池的配置你自己参考网上吧
这样在业务中,每次取到的池都是同一个池,不会多次创建。
如果你没有使用spring的话,我再想想办法怎么实现全局的单例模式

java多线程的情况下如何进行调试?

默认情况下,在调试多线程程序时,当遇到断点时(breakpoint),当前线程暂停,而其它线程继续运行,有些情况下,这是我们不想要看到的。比如下面的例子:

除第21个线程以外,其余都是Running状态。
修改:
Window->Preferences->Java->Debug:

在红色区域内,将默认的Suspend Thread 改为 Suspend VM

再调试多线程程序:
可以看到所有线程都Suspend了。

java线程优化问题

a1,a2,b1,b2对应的库不一样,天然不影响。
你这边最应该考虑的是对单个产品进行线程的时候,需要线程安全。
推荐一个关键字:
synchronized 关键字,代表这个方法加锁,相当于不管哪一个线程(例如线程A),运行到这个方法时,都要检查有没有其它线程B(或者C、 D等)正在用这个方法(或者该类的其他同步方法),有的话要等正在使用synchronized方法的线程B(或者C 、D)运行完这个方法后再运行此线程A,没有的话,锁定调用者,然后直接运行。它包括两种用法:synchronized 方法和 synchronized 块。

JAVA多线程到底能不能加快程序运行速度?

磁盘IO的速度在那里了,就算你再多的线程,也绕不过IO瓶颈。不是说多线程不能提高效率,这个要看你项目的性能瓶颈在哪里。 IO密集型,没必要多线程,容易弄巧成拙。建议Cache,某些文件系统在顺序读或写磁盘时速度相当快,如果恰好文件是顺序存储在磁盘上的,建议先尽量读进内存,再一次性写出去。其他什么磁盘内存通道之类的底层技术就不是Java能左右的了。

最新文章

随便看看