------- android培训、java培训、期待与您交流! ----------
一、Java线程的结构
Java支持一种“抢占式”(preemptive)调度方式。
线程从产生到消失,可分5个状态:
Newborn
线程在己被创建但未执行这段时间内,处于一个特殊的"Newborn"状态,这时,线程对象己被分配内存空间,其私有数据己被初始化,但该线程还未被调度。此时线程对象可通过start()方法调度,新创建的线程一旦被调度,就将切换到"Runnable"状态。
Runnable
Runnable意即线程的就绪状态,表示线程正等待处理器资源,随时可被调用执行。处于就绪状态的线程事实上己被调度,也就是说,它们己经被放到某一队列等待执行。处于就绪状态的线程何时可真正执行,取决于线程优先级以及队列的当前状况。线程的优先级如果相同,将遵循"先来先服务"的调度原则。
线程依据自身优先级进入等待队列的相应位置。某些系统线程具有最高优先级,这些最高优先级线程一旦进入就绪状态,将抢占当前正在执行的线程的处理器资源,当前线程只能重新在等待队列寻找自己的位置.这些具有最高优先级的线程执行完自己的任务之后,将睡眠一段时间,等待被某一事件唤醒.一旦被唤,这些线程就又开始抢占处理器资源。这些最高优先级线程通常用来执行一些关键性任务,如屏幕显示。
低优先级线程需等待更长的时间才能有机会运行。由于系统本身无法中止高优先级线程的执行,因此,如果你的程序中用到了优先级较高的线程对象,那么最好不时让这些线程放弃对处理器资源的控制权,以使其他线程能够有机运行。
Running
"Running"(运行)状态表明线程正在运行,该线己经拥有了对处理器的控制权,其代码目前正在运行。这个线程将一直运行直到运行完毕,除非运行过程的控制权被一优先级更高的线程强占。
综合起来,线程在如下3种情形之下将释放对处理器的控制权:
1.主动或被动地释放对处理器资源的控制权。这时,该线程必须再次进入等待队列,等待其他优先级高或相等线程执行完毕。
2.睡眠一段确定的时间,不进入等待队列。这段确定的时间段到期之后,重新开始运行。
3.等待某一事件唤醒自己。
Blocked
一个线程如果处于"Blocked"(堵塞)状态,那么暂时这个线程将无法进入就绪队列。处于堵塞状态的线程通常必须由某些事件才能唤醒。至于是何种事件,则取决于堵塞发生的原因:处于睡眠中的线程必须被堵塞一段固定的时间;被挂起、或处于消息等待状态的线程则必须由一外来事件唤醒。
Dead
Dead表示线程巳退出运行状态,并且不再进入就绪队列.其中原因可能是线程巳执行完毕(正常结束),也可能是该线程被另一线程所强行中断(kill)。
二、创建和使用线程的基本方法
1.线程的产生
在Java语言中,可采用两种方式产生线程:一是实现一个Runnable界面,二是扩充一个Thread类.java.lang中定义了一个直接从根类Object中派生的Thread类.所有以这个类派生的子类或间接子类,均为线程。在这种方式中,需要作为一个线程执行的类只能继承、扩充单一的父类。下面的例子通过扩充Thread类,用该线程自己的实现来覆盖Thread.run(),产生一个新类Counter。run()方法是Counter类线程所作的全部操作.
importjava.lang.*;
publicclassCounterextendsThread
{
publicvoidrun()
{....}
}
实现Runnable界面是最常用的产生线程的方法,它打破了扩充Thread类方式的限制。
Java语言源码中,Runnable界面只包含了一个抽象方法,其定义如下:
packagejava.lang.*;
publicinterfaceRunnable{
publicabstractvoidrun();
}
所有实现了Runnable界面的类的对象都可以以线程方式执行.下面的例子产生与上面例子相同的类.可以看到counter类中使用了一个Thread类的变量.
importjava.lang.*;
publicclasscounterimplementsRunnable
{ThreadT;
publicvoidrun()
{...}
}
2、基本方法
.publicsynchronizedvoidstart()
启动线程对象,调用其run()方法,随即返回。
.pubilcfinalvoidstop()(已过时该方法具有固有的不安全性)
停止线程的执行。
.publicfinalvoidresume()(已过时因为它具有死锁倾向)
唤醒被挂起的线程。只在调用suspend()之后有效。
.publicfinalvoidsuspend()(已过时因为它具有固有的死锁倾向)
挂起线程的执行。
.publicstaticvoidyield()
暂时中止当前正在执行的线程对象的运行。若存在其他线程,则随后调用下一个线程。
.publicstaticvoidsleep(longmills)throwsInterruptedException
使当前正处运行状态的线程睡眠mills毫秒。
.publicfinalvoidwait()throwsInterruptedException
使线程进入等待状态,直到被另一线程唤醒
.publicfinalvoidnotify()
把线程状态的变化通知给另一等待线程。
三、线程的同步
线程的使用,主要在于一个进程中多个线程的协同工作,所以线程的同步就很重要。线程的同步用于线程共享数据,转换和控制线程的执行,保证内存的一致性。
在Java中,运行环境使用程序(Monitor)来解决线程同步的问题。管程是一种并发同步机制,它包括用于分配一个特定的共享资源或一组共享资源的数据和方法.
Java为每一个拥有synchronized方法的对象实例提供了一个唯一的管程。为了完成分配资源的功能,线程必须调用管程入口。管程入口就是synchronized方法入口。当调用同步(synchronized)方法时,该线程就获得了该管程。
管程边界上实行严格的互斥,在同一时刻,只允许一个线程进入管程;当管程中已有了一个线程时,其它希望进入管程的线程必须等待,这种等待是由管程自动管理的。
如果调用管程入口的线程发现资源已被分配,管程中的这个线程将调用等待操作wait()。进入wait()后,该线程放弃占用管程,在管程外面等待,以便其它线程进入管程。
最终,占用资源的线程将调用一个管程的入口把资源归还给系统,此时,该线程需调用一个通知操作notify(),通知系统允许其中一个等待的线程获得管程并得到资源。被通知的线程是排队的,从而避免无限拖延。
在Java.lang中提供了用来编写管程的两个方法:notify()和wait()。此外还有notifyAll(),它通知所有等待的线程,使它们竞争管程,结果是其中一个获得管程,其佘返回等待状态。
四、线程的控制
.publicfinalvoidsetPriority(intnewPriority)
设置线程优先级。
.publicfinalintgetPriority()
获取并返回线程的优先级。
线程的优先级用于在运行队列中给线程排序,Java提供的抢占式调度,使得高级别的线程先运行。
五、线程的应用
在实际应用中,线程使用的范围很广,可用于控制实时数据处理、快速的网络服务,还有更快的图象绘制和打印,以及数据库中的数据的取回和处理等等。在Java中一个在不停运行的提供一些基本服务的例子是垃圾收集线程,垃圾收集线程,。该线程由Java虚拟机提供。它扫描程序中不再被访问的变量,将其所占的系统资源释放给系统。
写的好辛苦希望能给大家理解线程带来一点帮助!
相关推荐
黑马程序员_张孝祥_Java多线程与并发库,视频+代码+资料
黑马程序员_张孝祥_Java多线程与并发库,老师讲的非常仔细,老师很有耐心.欢迎大家下载学习.
NULL 博文链接:https://huangminwen.iteye.com/blog/1157983
当一个进程中线程有多个时,是多线程。 为什么要用多线程 1,让计算机"同时"做多件事情,节约时间。 2,后台运行程序,提高程序的运行效率.。 3,多线程可以让程序"同时"处理多个事情。 4,...
1、 面向对象、跨平台性、健壮性、安全性、可移植性、多线程性、动态性等。 2、 JRE(Java Runtime Environment,Java 运行时环境),它相当于操作系统部分,提供了 Java 程序运 行时所需要的基本条件和许多 Java ...
传智播客_Java培训_毕向东_Java基础[05-多线程]系黑马程序员_毕向东_Java基础视频教程
java并发库thread使用,传统线程技术、定时器技术、线程互斥技术,同步通讯技术、多线程共享数据、并发库应用,线程锁技术,阻塞锁、阻塞队列,线程池等应用
java.util.concurrent包、synchronized关键字、Swing框架、Java内存模型等内容也均有涉及,不仅能够了解Java多线程的相关知识,还可加深对Java语言的理解。 本书适合以下读者阅读 a.对多线程感兴趣的人 b.对Java...
264张图表 + 300段Java示例程序 = 轻松学习多线程编程 日本经典多线程入门书,原版长销11年! 本书适合以下读者阅读 a.对多线程感兴趣的人 b.对Java编程感兴趣的人 c.对设计模式感兴趣的人 d.对面向对象开发感兴趣的...
这是一个java写的拼图游戏,用了swing、多线程等知识,可以设置行数列、列数、还有使用多线程写的游戏动画,拼图的图块具有磁贴设计,代码封装性较强,容易移植,纯原创。
第1章 Java开发入门一.填空题1. 面向对象,SUN 2. JavaSE,JavaEE,JavaME3.面向对象、跨平台性、支持多线程4. JDK5.bin
|--利用FinalHttp实现多线程断点续传 |--加密之MD5 |--动画Animation详解 |--动画之view左右抖动 |--动画之移动动画 |--动画之组合动画 |--动画之缩放动画ScaleAnimation |--反序列化对象 |--发送短信 读天气 调音量...
这本书的pdf文件有162M,是最新版高清的pdf,网上原书售价60多元,这里提供的附件是百度云的链接地址。
萌新做的一个简单的Java拼图游戏 启动类:pers.sept.jigsaw1.swing下的...多线程。 下拉列表选择数字可以切换关卡图片,最后的“+”,可以添自己的图片到关卡中。 设有背景音乐 有一键通过按钮 等等,块下载去看看吧。
给大家分享一篇我在学习java过程中...包含常见的面试题:JVM、Java集合、多线程并发、java基础、SSM框架原理、微服务、Netty和RPC、网络、日志、算法、数据结构、加密、分布式算法、机器学习、大数据等知识点,都是干货
黑马程序员——Java异步课程源码 plugin Lombok logback.xml 说明 课堂代码主要在 case_java8 子模块内,按章节划分, io.github.hank.java.concurrent.n2 - 同步与异步 io.github.hank.java.concurrent.n3 - Java...
Java基础笔记分为 Java基础篇 和 Java加强篇 Java基础篇包括: 1. Java环境搭建、Java快速入门、IDEA开发工具 ...11. 多线程 12. 网络编程 13. 单元测试、反射、注解、动态代理 14. XML、解析、工厂模式和装饰模式
多线程支持: Java内置了对多线程的支持,允许程序同时执行多个任务。这对于开发需要高并发性能的应用程序(如服务器端应用、网络应用等)非常重要。 自动内存管理(垃圾回收): Java具有自动内存管理机制,通过...
2.适用于黑马程序员Java企业级实战开发《学成在线》微服务项目,基于SpringCloud、SpringCloudAlibaba技术栈开发。 3.采用xxl-job技术。 4.步骤概要: 4.1 作业分片方案 4.2 保证任务不重复执行 4.3 业务流程 5....
title: 黑马JVM学习笔记二 date: 2020-01-13 1:00:00 ...线程是私有的,多线程之间分别有各自的程序计数器记录对应线程的执行位置 程序计数器是Java虚拟机规范中唯一一个不会存在内存溢出的区(堆和栈等会出现内存溢