利用html做博客网站,广州门户网站制作公司,Dell网站建设建议,wordpress软件门户主题线程#xff08;thread#xff09; 是操作系统能够进行运算调度的最小单位。它被包含在进程之中#xff0c;是进程中的实际运作单位。一条线程指的是进程中一个单一顺序的控制流#xff0c;一个进程中可以并发多个线程#xff0c;每条线程并行执行不同的任务。 一、线程的… 线程thread 是操作系统能够进行运算调度的最小单位。它被包含在进程之中是进程中的实际运作单位。一条线程指的是进程中一个单一顺序的控制流一个进程中可以并发多个线程每条线程并行执行不同的任务。 一、线程的分类
我们知道计算机可以分为硬件和软件两大块硬件是基础软件提供实现不同功能的手段而软件又可以分为操作系统和应用程序操作系统专注于对硬件的交互管理并提供一个运行环境给应用程序使用应用程序则是能实现若干功能的并且运行在操作系统环境中的软件。
同样线程按照操作系统和应用程序两层次可以分为内核线程(Kernel-Level Thread)和用户线程(User Thread)。
内核线程Kernel-Level Thread,KLT 就是直接由操作系统内核Kernel下称内核支持的线程这种线程由内核来完成线程切换用户线程(User Thread,UT) 从广义上来讲一个线程只要不是内核线程就可以认为是用户线程而狭义上的用户线程指的是完全建立在用户空间的线程库上系统内核不感知线程存在的实现。用户线程的建立、同步、销毁和调度完全在用户态中完成不需要内核的帮助
二、Java线程的实现
Java创建线程的两种方式实现Runnable接口继承Thread类
实现Runnable接口写一个类实现Runnable接口,实现里面的run方法,用new Thread(Runnable target).start()方法来启动 增强了程序的健壮性代码能够被多个线程共享代码与数据是独立的线程体run()方法所在的类还可以从其他类继承一些有用的属性和方法避免了由于Java的单继承特性带来的局限有利于保持程序风格的一致性 继承Thread类写一个类继承自Thread类,然后重写里面的run方法,用start方法启动线程 Java中只支持单继承Thread子类无法再从其他类继承编写简单run()方法的当前对象就是线程对象可直接操纵
三、Java的线程优先级
Java使用的线程调度方式就是抢占式调度
虽然Java线程调度是系统自动完成的但是我们还是可以“建议”系统给某些线程多分配一点执行时间另外的一些线程则可以少分配一点——这项操作可以通过设置线程优先级来完成。 Java语言一共设置了10个级别的线程优先级Thread.MIN_PRIORITY至Thread.MAX_PRIORITY在两个线程同时处于Ready状态时优先级越高的线程越容易被系统选择执行。不过线程优先级并不是太靠谱原因是Java的线程是通过映射到系统的原生线程上来实现的所以线程调度最终还是取决于操作系统虽然现在很多操作系统都提供线程优先级的概念但是并不见得能与Java线程的优先级一一对应如Solaris中有2147483648232种优先级但Windows中就只有7种比Java线程优先级多的系统还好说中间留下一点空位就可以了但比Java线程优先级少的系统就不得不出现几个优先级相同的情况了 下图显示了Java线程优先级与Windows线程优先级之间的对应关系Windows平台的JDK中使用了除THREAD_PRIORITY_IDLE之外的其余6种线程优先级。
Java线程优先级Windows线程优先级1. Thread.MIN_PRIORITYTHREAD_PRIORITY_LOWEST2.THREAD_PRIORITY_LOWEST3.THREAD_PRIORITY_BELOW_NORMAL4.THREAD_PRIORITY_BELOW_NORMAL5. Thread.NORM_PRIORITYTHREAD_PRIORITY_NORMAL6.THREAD_PRIORITY_ABOVE_NORMAL7.THREAD_PRIORITY_ABOVE_NORMAL8.THREAD_PRIORITY_HIGHEST9.THREAD_PRIORITY_HIGHEST10. Thread.MAX_PRIORITYTHREAD_PRIORITY_CRITICAL
其实即使设置了线程的优先级一样无法确保这个线程一定先执行因为它有很大的随机性。它并无法控制执行哪个线程因为线程的执行是抢占资源后才能执行的操作而抢占到资源时最多是给于线程优先级较高的线程一点机会而已能不能抓住可是不一定的。
说到底就一句话线程优化级较高的线程不一定先执行
四、Java线程生命周期
线程的生命周期包含5个阶段包括新建、就绪、运行、阻塞、销毁。
新建就是刚使用new方法new出来的线程就绪就是调用的线程的start()方法后这时候线程处于等待CPU分配资源阶段谁先抢的CPU资源谁开始执行;运行当就绪的线程被调度并获得CPU资源时便进入运行状态run方法定义了线程的操作和功能;阻塞在运行状态的时候可能因为某些原因导致运行状态的线程变成了阻塞状态比如sleep()、wait()之后线程就处于了阻塞状态这个时候需要其他机制将处于阻塞状态的线程唤醒比如调用notify或者notifyAll()方法。唤醒的线程不会立刻执行run方法它们要再次等待CPU分配资源进入运行状态;销毁如果线程正常执行完毕后或线程被提前强制性的终止或出现异常导致结束那么线程就要被销毁释放资源;
完整的生命周期图如下