`
jiabao523527
  • 浏览: 8054 次
  • 性别: Icon_minigender_1
  • 来自: 天津
最近访客 更多访客>>
社区版块
存档分类
最新评论

黑马程序员_java多线程

 
阅读更多

                          ------- 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(),产生一个新类Counterrun()方法是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多线程与并发库,老师讲的非常仔细,老师很有耐心.欢迎大家下载学习.

    黑马程序员_张孝祥_Java多线程与并发库 视频+代码+资料

    根据给定文件的信息,我们可以提炼出以下关于Java多线程与并发库的相关知识点: ### Java多线程基础 1. **线程的概念**:在Java中,线程是程序执行流的基本单元。一个标准的Java应用程序至少有一个线程,即主...

    黑马程序员_Java基础辅导班教程课件[第01期]第13天

    在"黑马程序员_Java基础辅导班教程课件[第01期]第13天"中,我们聚焦于Java编程语言的基础知识,这是一门面向初学者的课程,旨在帮助学员快速掌握Java开发的基本技能。第13天的课程通常会涵盖上一天(第12天)所学...

    01_黑马程序员_张孝祥_Java基础加强_课程价值与目标介绍.zip

    【标题】"01_黑马程序员_张孝祥_Java基础加强_课程价值与目标介绍.zip" 提供的是一门由黑马程序员机构推出的Java基础强化课程,由讲师张孝祥主讲,旨在深入讲解Java编程的基础知识并进行能力提升。 【描述】中提到...

    黑马程序员_毕向东_Java基础源码.rar

    这个名为“黑马程序员_毕向东_Java基础源码.rar”的压缩包文件,包含了丰富的Java基础源代码实例,对于初学者来说,是深入了解Java编程的良好资源。 一、Java基本语法 Java语言以其严格的类型检查和面向对象特性...

    黑马程序员-java多线程技术01

    本教程将聚焦于Java中的多线程技术,以“黑马程序员-java多线程技术01”为学习起点,探讨如何在Java中实现并管理线程。 首先,我们来理解什么是线程。线程是操作系统分配CPU时间的基本单元,一个进程中可以有多个...

    黑马程序员_(适合初学者入门的Java基础视频)

    "黑马程序员_(适合初学者入门的Java基础视频)"是一套专为初学者设计的Java基础教学课程,旨在帮助零基础的学习者逐步掌握Java编程的基本概念和技能。 该视频教程涵盖了Java的基础知识,包括: 1. **环境搭建**:...

    黑马程序员_Java基础辅导班教程课件[第01期]第10天

    在"黑马程序员_Java基础辅导班教程课件[第01期]第10天"中,我们聚焦于Java编程语言的基础知识,这是一门面向初学者的课程,旨在帮助学员快速掌握Java的核心概念。通过这个阶段的学习,学员将能够理解并运用Java的...

    黑马程序员_Java基础辅导班教程课件[第01期]第4天

    在"黑马程序员_Java基础辅导班教程课件[第01期]第4天"中,我们可以推测这是针对初学者的Java编程课程,旨在帮助学员掌握Java的基础知识。 在课程的第4天,可能讲解了以下核心概念: 1. **类(Class)**:`Demo.class...

    黑马程序员入学Java精华总结

    ### 黑马程序员入学Java精华总结 #### 一、Java概述与基础知识 1. **何为编程?** - 编程是指通过编写计算机能够理解的指令来解决问题或完成特定任务的过程。这些指令通常被组织成算法,并使用某种编程语言实现。...

    黑马程序员_从零开始征服Android之旅(第一季)源码和笔记

    《黑马程序员_从零开始征服Android之旅(第一季)源码和笔记》是一份全面的Android开发学习资源,旨在帮助初学者系统地掌握Android开发技术,实现从理论到实践的跨越。这份资料涵盖了一系列关键知识点,包括但不限于...

    黑马程序员_毕向东最新经典Java基础视频

    根据提供的文件信息,我们可以推断出这是一套由知名IT教育机构“黑马程序员”出品、由讲师毕向东主讲的Java基础教学视频。由于实际视频内容无法直接获取,本篇将依据标题、描述以及部分标签内容,综合分析并展开相关...

    黑马程序员–Java多线程讲解笔记

    Java多线程是Java编程中不可或缺的部分,它允许程序同时执行多个任务,提高了程序的效率和响应速度。本文主要探讨了多线程的概念、应用场景以及Java中创建线程的两种方式。 首先,进程和线程是理解多线程的基础概念...

    传智播客.黑马程序员《Java 基础入门》课后习题答案

    1、 面向对象、跨平台性、健壮性、安全性、可移植性、多线程性、动态性等。 2、 JRE(Java Runtime Environment,Java 运行时环境),它相当于操作系统部分,提供了 Java 程序运 行时所需要的基本条件和许多 Java ...

    java并发库高级应用源码--张孝祥

    Java并发库是Java编程中非常重要的一个领域,它为开发者提供了高效、安全的多线程编程工具。在《java并发库高级应用源码--张孝祥》中,我们将会深入探讨Java中的线程管理和并发控制策略,这对于我们理解和优化多线程...

    黑马程序员_2小时教你写一个安卓程序[第01天]课件源码

    在本课程中,“黑马程序员”将引导我们快速入门安卓应用程序的开发,这是一段为期两天的密集学习旅程,第01天的课程主要侧重于基础知识的建立和首个安卓程序的编写。通过这次学习,我们将了解到安卓开发环境的搭建、...

    多线程高新(黑马程序员)

    本文将深入探讨“多线程高新”这一主题,结合黑马程序员的课程内容,来阐述多线程的核心概念、优势、实现方式以及在实际应用中的注意事项。 首先,多线程是指在一个进程中同时执行多个线程,这些线程可以共享同一...

    黑马程序员入学Java知识——精华总结.doc

    Java内置了对多线程的支持,通过Thread类或实现Runnable接口可以创建并管理多个执行线程。 17. **网络编程**: Java提供了丰富的API进行网络通信,如Socket和ServerSocket类,用于客户端和服务器之间的连接。 ...

    黑马程序员入学Java知识(精华总结)

    ### 黑马程序员入学Java知识(精华总结) #### 一、Java概述与基础知识 ##### 1、何为编程? 编程是指使用计算机语言来编写指令,这些指令被计算机执行以完成特定任务的过程。通过编程,我们可以控制计算机的行为...

Global site tag (gtag.js) - Google Analytics