java多线程实际使用时需要new线程吗。

多线程开发的时候,比如说买票,三个窗口卖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 编写的 “程秘”


  • 如果是实际的场景中,可以通过创建线程池,而不是为每个窗口单独创建一个线程。线程池是一组可重复使用的线程集合,可以执行多个任务,适合于需要同时执行多个任务的情况。线程池的大小应该根据任务的性质和系统的负载来确定,不需要为每个窗口都创建一个线程。
  • 在票数上面加锁是保证多线程并发安全的一种方式,可以防止多个线程同时修改同一个数据出现问题。但是要注意加锁的范围,应该尽量缩小加锁的范围,避免出现死锁等问题。
  • 如果使用线程池,那么窗口就不需要直接创建线程了,可以通过向线程池提交任务来实现并发操作。如果线程池中只有两个线程,而三个窗口同时操作,那么第三个窗口会等待前面的窗口完成操作之后才能操作。
  • 线程池一般用于需要执行多个任务的场景,例如网络爬虫、Web服务器等。线程池可以减少线程创建和销毁的开销,提高程序的性能。线程池会根据需要动态地创建线程,并根据线程的空闲时间来回收线程。线程池中的线程数量一般根据任务的性质和系统的负载来自动调整。
  • 在查询接口中加同步锁是为了保证多个线程同时访问接口时的安全性,避免出现数据竞争的问题。如果有多个线程同时调用接口,而且接口中存在共享数据,那么就需要加锁来保证数据的一致性。加锁的方式可以使用synchronized关键字或者Lock接口来实现,具体使用哪种方式可以根据场景来选择。至于new线程的问题,这取决于具体的场景,有时候可能需要创建新的线程来处理一些异步任务,有时候则可以利用线程池来处理并发任务。
不知道你这个问题是否已经解决, 如果还没有解决的话:

如果你已经解决了该问题, 非常希望你能够分享一下解决方案, 写成博客, 将相关链接放在评论区, 以帮助更多的人 ^-^