嘻嘻,刚刚开通CSDN的博客,前三天又不能发表文章,今天终于等到第四天啦!前两天,师兄让我思考几个关于线程的问题,今天就拿出来分享一下,就当是我们共同探讨啦~~~~~~
1.线程是什么?
线程是由进程而来的,进程就是一个正在执行的程序,是动态的(程序是含有指令和数据的文件,是静态的)。线程就是进程中某个单一顺序的执行路线,是比进程更小的执行单位。同一个进程中所有线程 都在同一块地址空间中工作,这些线程可以共享同一块内存和系统资源,比如共享一个对象或者文件。
对于一个软件来说,有可能是多线程的,也有可能是多进程。比如,word就是一个多线程的软件,同时打开几个word文档时,任务管理器中只有一个word.exe进程。一旦一个文档崩溃,其他文档也会崩溃。多线程是为了解决线程间的资源共享,并且,线程间切换、通信更方面高效。而sogo浏览器就是一个多进程的软件,每打开一个页面,任务管理器里就会窗器一个sogoExplorer.exe进程。
2.一个软件,启动起来……线程是怎样的
桌面软件?
虚拟机创建一个java.exe进程,软件程序在这个进程上运行。
web软件?
通过浏览器访问tomcat,tomcat配置的虚拟机创建一个javaw.exe进程,软件程序在这个进程上运行。
Java.exe有控制台,可以进行输入指令、编译、显示等;javaw.exe没有控制台,只可以输出,执行效率更高。
3.一个Java软件,线程是指Java类本身还是虚拟机?
虚拟机,虚拟机会为这个java软件创建一个java.exe/javaw.exe进程,软件程序在这个进程中运行。而java类只是.class文件
4.当有人使用该软件的时候……线程是怎样的
线程状态和周期:
1.新建(newborn) 2.就绪(runnalbe) 3.运行(running) 4.阻塞(blocked)5.死亡(dead)
软件在启动时,虚拟机会创建一个java.exe(桌面)/javaw.exe(web)进程来运行这个软件,该进程通过主线程入口的main方法运行(逐层调用)软件中的各个线程(前台线程)。对于桌面软件,通过start()方法启动线程,一般情况下线程会自动调用run()方法,运行线程;对于web软件,是由服务器(tomcat/weblogic)负责线程的调度,tomcat内配置的是官方虚拟机,weblogic配置的自己开发的虚拟机,性能更好。当cpu资源短缺是会进入阻塞状态。前台线程运行完毕后,由后台线程(比如虚拟机的垃圾回收线程)结束其生命周期。
5.软件从界面请求到查询数据库到返回结果,整一条龙的程序逻辑,都是一个线程的吗?还是说不通的层,会有不同的线程?
都是一个线程
说到这个问题,我想到了hibernate的session机制。Hibernate中session和线程是绑定在一起的。session中存放数据库连接(Treadlocal机制),并且设定了最少连接数,最大连接数等数据,同时,session有缓存机制,会将数据暂时保存。。用户通过getSession()调用conection,response动作后释放连接,将conection放回session中供其他用户调用。当session中的连接不足时,Factory会自动创建连接,直到最大连接数,达到最大连接时,就只能等待其他用户释放连接。这样,同一个用户在不同的线程中可能会取到不同的session,那么就会导致数据错误。要改进这种情况,我们可以借助web中session来进行过滤。这样就会麻烦很多。不过,将spring框架整合进来后我们就不用担心这个问题,spring可以帮我们解决。
关于线程,今天就说这么多吧!其他问题,在慢慢来咯~~~