问题描述
- java 关于类似售票系统的多线程并发 的问题
-
本人对多进程和多线程不大了解,还请各位高手解答下,先谢了。问题如下:
1.多线程的并发,我查了下资料,一般解释的是:一个进程可以包含多个线程,一个线程完成一个功能,这样,进程执行的时候,它包含的多个线程可以看成同时执行。
那多线程的并发,可不可以有另外的理解:如果这时的某个进程只有一个线程,那么,同时有多个类似的进程同时启动,这时是不是就产生了多个进程下要同时完成相同任务的多个线程,这算不算多线程的并发?
下面拿售票系统举例说明下,
2.像售票系统,应该就干了一件事,就是售票(包括查询),java实现的时候是不是就是一个线程?即一个进程对应一个线程。
3.这时,同一个人同一台电脑上,打开A浏览器买票,然后又打开B浏览器买票,是不是相当于有2个进程(不是线程)?
4.那售票系统的多线程并发 ,可不可以理解为多进程的并发?
解决方案
首先,要搞清楚并发和并行的不同。
如果你的计算机只有一个处理器,无论是多线程还是多进程,在某一时刻,都是只有一个线程/进程在执行,操作系统会让这些线程轮流执行,从宏观上看是并发,但是不是并行。
如果你的计算机有多个处理器(包括多核),那么每个处理器可以同时执行一个线程,可能这些线程来自一个进程,也可能来自多个进程。此时叫做并行。
如果你的服务器只有一个进程,并且其中只有一个线程,当然不可能并发,但是不等于说,不能实现一个这样的单线程的服务器同时处理多个客户端的访问要求。因为计算机处理请求的时间是非常短的,即便是单线程,从宏观上看,也足够满足多个客户端轮流请求服务器的需要。
解决方案二:
如果我们追溯最早最早,或者最原始最原始的操作系统,这种粗陋的操作系统可以不区分线程和进程。从这个意义去理解,进程和线程有很多相通的地方,甚至本质山它们是同源的。
等到操作系统复杂到一定程度,我们有了两种不同的需求,一种是为了程序和程序之间减少干扰,一个程序崩溃,系统别的程序不受影响,这样我们有了进程,进程强调隔离性。进程和进程有各自独立的存储。另一种是方便程序和程序之间互相通讯,同时为了提高性能减小程序切换的开销,因此我们有了线程,线程除了堆栈以外,共享全部的存储。所以也可以说,进程就是重型的线程,也可以说线程是轻量的进程。
解决方案三:
(1)理论上说,线程是并发执行(并且在多处理器计算机上并行执行),但是还取决于这么几个条件:
一个是线程之间使用了同步,比如线程1和线程2同时访问一个加锁的变量(比如使用临界区,monitor或者lock),那么在访问变量的这些代码段内,只有一个线程在执行,别的线程在等待。
一个是进程或者线程被设置了执行掩码,那么它在特定的处理器上执行。
(2)我说了,进程相当于重量级的线程,因此多进程类似多线程,区别只是多进程无法共享内存(如果需要共享内存,相当于进程的通讯)。另外在性能上,进程的启动、执行、切换的开销要线程大很多。这么说,线程切换可能只要几十个几百个时钟,纳秒级别,而进程的切换需要上万始终,毫秒级别。一个计算机可以有几千几万的线程,但是这么多的进程恐怕就吃不消了。
解决方案四:
(1) 多线程的并发,是针对单个进程而言的。 一个进程下,可以创建多个线程,共享数据,并行计算。
(2)关于售票系统,只要是有界面的,就必然有多线程。你点击了某个按钮,系统会创建子线程去查询数据库,处理请求;同时你点击其他按钮,也会立即响应。
就算只做一件事,也是可以并行操作的。 一件事可以拆分成很多步骤的。
(3)打开两个浏览器买票这种,多进程是浏览器实现的,代码在浏览器中执行;服务器只负责接收请求,处理请求并返回结果,应该会用到多线程。
(4)多进程并发和多线程并发只是针对不同的问题,提供的一种解决方案。
一般情况下,一个软件是单进程运行的,内部多线程处理; B/S模式,通过浏览器访问网页,这个确实是多进程的并发,相互之间,不会影响。
就算是多个进程运行,同一个进程下,也是会有多个线程的。
解决方案五:
答:
问题一: 进程和线程是两个不同的概念, 一个是操作系统级, 一个是应用程序开发级, 两者都有并发的问题, 但进程的并发一般不是你能解决得好的.
问题二:售票系统看你怎么开发了,如果是B/S+数据库模式, 你自己要在程序中考虑并发问题, 主要是对数据库的并发.
问题三:系统会产生两个子进程.这是由浏览器父进程分配产生的.
问题四:这个问题提得不好,不要纠结概念了, 自己找书看看售票系统的开发例子吧,很多的.B/S模式和C/S模式是不同的.现在一般用B/S模式你只考虑数据库的并发了,感觉你想得太多,动手太少.,
解决方案六:
多线程与单线程玉客户端是没有关系的,主要是看服务器代码怎么实现的。
你说的客户端多个同时买票的问题是并发的问题。