您的位置:首页 > 编程语言 > Java开发

Java多线程初步了解

2015-02-02 20:09 295 查看
好吧,因为要找实习笔试面试了,所以根据师兄给的书单,了解一下java多线程了,tomcat等知识,今天就先谈谈java多线程 了。回想一下咯,操作系统里面有关进程和线程的关系,一直以为很虚的东西,那是因为之前没写过,现在还是有必要去了解的。

1.线程和进程的区别,以及java虚拟机运行时的内存状态。

一个进程可以包含多个线程,一个进程对应一个程序的执行,但是一个线程则是进程执行过程中的一个单独的执行序列,线程有时候也被称为轻量级进程。

一个Java虚拟机的实例运行在一个单独的进程中,不同的线程共享java虚拟机进程所属的堆内存,因为堆里面存放的是进程运行期间所创建的对象。这样是为什么不同的线程可以访问同一个对象。线程彼此共享堆内存,但是各自有各自的栈空间哦,里面存放方法返回值,局部变量等。这就可以理解,为什么当一个线程调用一个方法的时候,它的局部变量可以保证线程安全。但是堆内存并不是线程安全的,必须通过显示的生命同步来确保线程安全。

2.线程的各种状态

这个操作系统讲的好细咯,我们可以结合java里面Thread类里面提供的相应方法进行说明。

a.可执行状态(Runnable):当调用start()方法后,一个线程变为可执行状态,但是并不意味着他会立刻开始执行。而是被放入线程池,由线程调度器根据线程优先级决定何时挂起执行。

b.执行中(Running):处理器已经在执行线程的代码。他会一直运行直到被阻断,或者通过静态方法Thread.yield()自行放弃执行的机会,考虑到场景切换所带来的开销,yield()方法不应该经常被调用。

c.等待中(Waiting):线程由于等待I/O或者等待外部进程的处理结果而处于等待状态,调用Thread.wait()方法会使得当前线程进入等待状态,直到其他线程调用Thread.notify()或者Thread.notifyAll().

d.睡眠中(Sleeping):重载方法Thread.sleep(milliseconds),可以迫使线程进入睡眠状态。

3.Thread.State枚举类型包含了java虚拟机支持的全部的线程状态类型,下面几点java的线程宗旨确保了这些线程状态成为可能。

对象可以被任何线程共享和修改。
线程调度器的抢占性特性,使得线程可以随时在多核处理之间切换处理器内核,这意味着方法可以在执行的过程中切换状态。否则方法中的死循环将永远阻塞CPU,并且使得不同线程的其他方法始终得不到执行。
为了防止线程安全问题,那些脆弱的方法或者代码块可以被锁定。这使得线程可以处于被锁定或者加锁请求处理中两种状态。
线程在处理I/O资源(如Sockets,文件句柄,数据库连接等)时会进入等待状态,
处于I/O读写中的线程不能被切换,因此他们或者以成功/失败的结果正常完成处理,或者其它线程关闭了相应的资源,迫使他进入死亡或者完成的状态。这也是为什么一个合理的超时时间可以避免线程由于I/O处理而被永远阻塞,从而导致严重的性能问题。
线程可以进入睡眠状态,以使得其他处于等待状态的线程有机会执行。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: