Java与线程

线程的实现

1. 使用内核线程实现

直接使用操作系统的内核支持的线程,何种线程由内核来完成线程切换,内核通过操纵调度器(Scheduler)对线程进行调度,并负责将线程的任务映射到各个处理器上.

程序一般不会直接去使用内核线程,而是去使用内核线程的一种高级接口----轻量级进程(Light Wiehgt Process, LWP),它就是我们通常说的线程.轻量级进程与内核线程是1:1的一对一关系.

局限性:

1) 由于是内核线程实现,各种线程操作,如创建,析构及同步,都需要进行系统调用,代价很高,需要在用户态(User Mode)和内核态(Kernel Mode)中来回切换;

2) 每个轻量级进程都需要有一个内核线程的支持,因此轻量级进程还要消耗一定的内核资源,因此一个系统支持轻量级进程的数量是有限的.

2. 使用用户线程实现

完全建立在用户控件的线程库上,系统内核不能感知线程存在.

这种线程不需要切换到内核态,操作可以是非常快速低消耗,也可以支持大规模的线程数量,部分高性能数据库中的多线程就是由用户线程实现的.

这种进程与用户之间1:N的关系称为一对多的线程模型.

局限性:

1) 线程的创建切换调度都需要考虑的问题,而且由于操作系统只把处理器资源分配到进程,阻塞处理,多处理器系统中如何将线程映射到其他处理器上的等这类问题解决难度异常大,甚至不肯能完成.

因此使用用户线程的程序越来越少.

3. 使用用户线程加轻量级进程混合实现

用户线程还是完全建立在用户控件中,因此用户线程的创建切换析构等操作依然廉价,并且可以支持大规模的与用户线程并发.

而操作系统提供支持的轻量级进程则作为用户线程和内核线程之间的桥梁,这样内核提供的线程调度功能及处理器映射,并且用户线程的系统调用要通过轻量级线程来完成,降低了整个进程被完全阻塞的风险.

这种混合模式中,用户线程与轻量级进程的数量比是不定的,N:M的关系,多对多的线程模型.

Java线程的实现

Java线程模型为基于操作系统原生线程模型来实现,操作系统支持怎样的线程模型,很大程度决定了Java虚拟机的线程是怎样映射的.

对于Sun JDK来说,它的Windows和Linux都是使用一对一的线程模型实现的.一条Java线程映射到一条轻量级进程,因为Windows和Linux系统提供的线程模型就是一对一的.

Java线程调度

1. 协同式线程调度(Cooperative Threads-Scheduling)

线程的执行时间由线程本身来控制,线程把自己工作执行完了之后,要主动通知系统切换到另外一个线程上.

坏处是,线程执行时间不可控制,可能程序会一直阻塞在那里.

2. 抢占式线程调度(Preemptive THreads-Scheduling)

每个线程将有系统来分配执行时间,线程的切换不由线程本身来决定

好处:线程的执行时间是系统可控的,不会有一个线程导致整个进程阻塞的问题,Java使用的线程的调度方式就是抢占式调度.

线程状态转换

时间: 2024-10-07 22:38:07

Java与线程的相关文章

Java中线程封闭之ThreadLocal

在访问共享数据时通常使用同步.若不使用同步则可以将对象封闭在一个线程中达到线程安全的目的,该方法称为线程封闭(Thread Confinement).其中实现线程封闭中规范的方法是使用ThreadLocal类.线程封闭技术一种常用的使用场景是在JDBC Connection对象. public class ConnectionHelper{private final static String URL = "";private final static ThreadLocal<C

Java多线程系列一——Java实现线程方法

Java实现线程的两种方法 继承Thread类 实现Runnable接口 它们之间的区别如下: 1)Java的类为单继承,但可以实现多个接口,因此Runnable可能在某些场景比Thread更适用2)Thread实现了Runnable接口,并且有更多实用方法3)实现Runnable接口的线程启动时仍然需要依赖Thread import java.util.Map; import java.util.concurrent.ConcurrentHashMap; import org.junit.As

Java用户线程和守护线程

1.用户线程和守护线程的区别用户线程和守护线程都是线程,区别是Java虚拟机在所有用户线程dead后,程序就会结束.而不管是否还有守护线程还在运行,若守护线程还在运行,则会马上结束.很好理解,守护线程是用来辅助用户线程的,如公司的保安和员工,各司其职,当员工都离开后,保安自然下班了. 2.用户线程和守护线程的适用场景由两者的区别及dead时间点可知,守护线程不适合用于输入输出或计算等操作,因为用户线程执行完毕,程序就dead了,适用于辅助用户线程的场景,如JVM的垃圾回收,内存管理都是守护线程,

深入理解Java之线程池

原作者:海子 出处:http://www.cnblogs.com/dolphin0520/ 本文归作者海子和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利. 在前面的文章中,我们使用线程的时候就去创建一个线程,这样实现起来非常简便,但是就会有一个问题: 如果并发的线程数量很多,并且每个线程都是执行一个时间很短的任务就结束了,这样频繁创建线程就会大大降低系统的效率,因为频繁创建线程和销毁线程需要时间. 那么有没有一种办法使得线程可

Java基础——线程总结

Java基础--线程总结 一.线程是什么? 线程:一个程序里不同的执行路径. 二.如何创建线程? 两种方法创建线程: 第一种 (1)定义具体功能类实现Runnable接口,可以多次调用而实现数据共享 (2)Thread myThread = new Thread(-)          //参数为Runnable接口类型 (3)Runnable中只有一个方法 public void run(){--} //用以定义线程运行体 第二种 (1)定义一个Thread的子类并重写run()方法 clas

多线程(三) java中线程的简单使用

============================================= 原文链接:多线程(三) java中线程的简单使用 转载请注明出处! ============================================= java中,启动线程通常是通过Thread或其子类通过调用start()方法启动. 常见使用线程有两种:实现Runnable接口和继承Thread.而继承Thread亦或使用TimerTask其底层依旧是实现了Runnabel接口.考虑到java的

Java之线程,常用方法,线程同步,死锁

1, 线程的概念 进程与线程 进程:每个进程都有独立的代码和数据空间(进程上下文),进程间的切换会有较大的开销,一个进程包含1--n个线程.(进程是资源分配的最小单位) 线程:同一类线程共享代码和数据空间,每个线程有独立的运行栈和程序计数器(PC),线程切换开销小.(线程是cpu调度的最小单位) 切换而不是同步 一个程序中的方法有几条执行路径, 就有几个线程 Java中线程的生命周期 Java线程具有五中基本状态 新建状态(New):当线程对象对创建后,即进入了新建状态,如:Thread t =

Java 并发 线程同步

Java 并发 线程同步 @author ixenos 同步 1.异步线程本身包含了执行时需要的数据和方法,不需要外部提供的资源和方法,在执行时也不关心与其并发执行的其他线程的状态和行为 2.然而,大多数实际的多线程应用中,两个或两个以上的线程需要共享对同一数据的存取,这将产生同步问题(可见性和同步性的丢失) 比如两个线程同时执行指令account[to] += amount,这不是原子操作,可能被处理如下: a)将account[to]加载到寄存器 b)增加amount c)将结果写回acco

Java 并发 线程属性

Java 并发 线程属性 @author ixenos 线程优先级 1.每当线程调度器有机会选择新线程时,首先选择具有较高优先级的线程 2.默认情况下,一个线程继承它的父线程的优先级 当在一个运行的线程A里,创建另一个线程B的时候,那么A是父线程,B是子线程.当在一个运行的线程A里,创建线程B,然后又创建了线程C,这时候虽然B比C创建早,可是B并不是C的父线程,而A是B和C的父线程. 3.线程的优先级高度依赖于系统,当虚拟机依赖于宿主机平台的线程实现机制时,Java线程的优先级被映射到宿主机平台

Java的线程安全

线程安全 我们这里讨论的线程安全,就限定于多个线程之间存在共享数据访问这个前提,因为如果一段代码根本不会与其他线程共享数据,那么从线程安全的角度来看,程序是串行执行还是多线程执行对它来说是完全没有区别的. 共享的数据 可以将Java语言中各种操作共享的数据分为以下5类:不可变.绝对线程安全.相对线程安全.线程兼容和线程对立. 不可变 不可变(Immutable)的对象一定是线程安全的,无论是对象的方法实现还是方法的调用者,都不需要再采取任何的线程安全保障措施,final关键字带来的可见性,只要一