多线程开发的时候,比如说买票,三个窗口卖100张票,教学视频里都是在代码里new三个线程模拟卖100张票。
但是在实际的使用场景中,不是模拟的时候,实际的窗口去卖票。
1.开发的时候还要为每个窗口new线程吗?
2.还是直接不需要考虑new线程的事,在票数上面加锁就行了。
3.如果需要new线程的过程是不是直接就是窗口调用线程池里面的线程(或者操作票的时候给窗口new个线程),来操作票数,这时候线程池里有两个线程的话,三个窗口同时操作是不是就阻塞一个窗口。
4.如果不考虑new线程的过程,那线程池是什么时候用的,什么情况下会new线程。
5.看项目代码的时候一个查询的接口,传入一个flag为1或0,分别代表通过和没通过的数据判断,接口里面通过判断调用1和0调用不同的sql语句查询出不太的数据返回。没有看到有关new线程的地方。但是接口里面加了同步锁,这是因为如果很多人调这个接口的话会产生返回数据错误的问题吗,加了同步锁的话是不是跟多线程又有关系了。这样的话new线程是在什么时候new的。和买票的new线程的时候一样吗。
线程池一句两句说不清,线程池几个核心参数,核心线程数,最大线程数,队列以及拒绝策略,比较完美的运行场景是线程池创建的线程达到核心线程数,阻塞队列的消费速率大于等于入队速率,
线程的创建是线程池运行任务时创建的,当你把一个任务交付线程池运行时,线程池内部首先是判断核心线程数满了没(暂时不考虑配置线程存活时间的场景),没满线程直接创建,在这个阶段的任务,基本上都是直接创建线程,而这个过程对你不可见,当所有核心线程都在处理任务时,再入队的任务则是会堆积到阻塞队列,这时候会一直队列堆积数据,直到达到上限(这里如果你选择的队列类型是无界队列,一直堆积任务的结果就是oom),当队列也达到上限后,才会去创建非核心线程(线程数= 最大线程数- 核心线程数),达到最大线程数以后,你再交给线程池的任务,就会执行拒绝策略了!
然后就是和你的项目对应起来,web容器会为每一个请求,单独分配一个线程去处理任务,这里就是线程池做的事情,对应到上面,http请求就是任务,当你使用多个浏览器打开同一个页面时,这就有多线程了,线程的创建就是在你发起http请求时,线程池自行决定是否创建线程还是复用线程
在实际的使用场景中,一般不需要为每个窗口新建一个线程来卖票。一般情况下,可以采用对票数进行加锁的方式来避免多个窗口同时卖同一张票的问题,从而避免出现售票数超过总票数的情况。
线程池是一组已经创建好的线程集合,通过向线程池提交任务来让线程池中的线程执行这些任务。在多线程开发中,使用线程池可以有效地减少线程创建和销毁的开销,提高程序的执行效率。线程池中的线程一般都是事先创建好的,当有任务需要执行时,线程池中的线程会被唤醒来执行任务。
对于查询接口加同步锁的情况,这通常是因为在多线程的环境下,多个线程同时访问该接口,可能会导致返回数据错误的情况。在这种情况下,可以通过加同步锁的方式来保证每个线程访问该接口时的互斥性,从而避免出现数据错误的情况。
一般情况下,如果需要使用多线程来处理一些耗时的操作,可以使用线程池来管理线程。通过向线程池提交任务,线程池中的线程会自动执行这些任务,不需要手动新建线程。但是,在某些情况下,如果需要处理一些特殊的任务,可能需要手动新建线程来处理这些任务。
方案来自 梦想橡皮擦 狂飙组基于 GPT 编写的 “程秘”