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的线程宗旨确保了这些线程状态成为可能。
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处理而被永远阻塞,从而导致严重的性能问题。 线程可以进入睡眠状态,以使得其他处于等待状态的线程有机会执行。
相关文章推荐
- 对于Java中多线程互斥锁初步了解
- JAVA学习第二十一课(多线程(一)) - (初步了解)
- JAVA学习第二十一课(多线程(一)) - (初步了解)
- Java多线程(一)初步了解
- java-3-多线程-初步了解-3-同步
- java-3-多线程-初步了解-3-并发
- JAVA初步了解
- 深入了解android平台的jni---本地多线程调用java代码
- Java多线程程序设计初步(2)
- Java多线程初步--总结
- java JDK源码和API的初步了解
- 深入了解android平台的jni---本地多线程调用java代码
- 深入了解android平台的jni---本地多线程调用java代码
- Java多线程程序设计初步
- 面试求职中需要了解的Java多线程知识
- 面试求职中需要了解的Java多线程知识
- Java多线程初步探讨
- Java多线程程序设计初步(1)
- Java多线程编程初步
- Java.nio初步了解和学习