我的编程空间,编程开发者的网络收藏夹
学习永远不晚

怎样实现Java线程的深入探讨

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

怎样实现Java线程的深入探讨

这篇文章将为大家详细讲解有关怎样实现Java线程的深入探讨,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。

1.什么是线程  


  一般来说,我们把正在计算机中执行的程序叫做"进程"(Process) ,而不将其 
称为程序(Program)。所谓"线程"(Thread),是"进程"中某个单一顺序的控制流。 
新兴的操作系统,如Mac,windows NT,Windows 95等,大多采用多线程的概念,把线 
程视为基本执行单位。线程也是Java中的相当重要的组成部分之一。 

  甚至最简单的Applet也是由多个线程来完成的。在Java中,任何一个Applet的 
paint()和update()方法都是由AWT(Abstract Window Toolkit)绘图与事件处理线 
程调用的,而Applet 主要的里程碑方法——init(),start(),stop()和destory() 
——是由执行该Applet的应用调用的。 

  单线程的概念没有什么新的地方,真正有趣的是在一个程序中同时使用多个线 
程来完成不同的任务。某些地方用轻量进程(Lightweig ht Process)来代替线程 
,线程与真正进程的相似性在于它们都是单一顺序控制流。然而线程被认为轻量是 
由于它运行于整个程序的上下文内,能使用整个程序共有的资源和程序环境。 

  作为单一顺序控制流,在运行的程序内线程必须拥有一些资源作为必要的开销 
。例如,必须有执行堆栈和程序计数器。在线程内执行的代码只在它的上下文中起 
作用,因此某些地方用"执行上下文"来代替"线程"。 

  2.线程属性 

  为了正确有效地使用线程,必须理解线程的各个方面并了解Java 实时系统。 
必须知道如何提供线程体、线程的生命周期、实时系统如 何调度线程、线程组、 
什么是幽灵线程(Demo nThread)。 

  (1)线程体 
  所有的操作都发生在线程体中,在Java中线程体是从Thread类继承的run()方 
法,或实现Runnable接口的类中的run()方法。当线程产生并初始化后,实时系统调 
用它的run()方法。run()方法内的代码实现所产生线程的行为,它是线程的主要部 
分。 

  (2)线程状态 
  附图表示了线程在它的生命周期内的任何时刻所能处的状态以及引起状态改 
变的方法。这图并不是完整的有限状态图,但基本概括了线程中比较感兴趣和普遍 
的方面。以下讨论有关线程生命周期以此为据。 


  ●新线程态(New Thread) 
  产生一个Thread对象就生成一个新线程。当线程处于"新线程"状态时,仅仅是 
一个空线程对象,它还没有分配到系统资源。因此只能启动或终止它。任何其他操 
作都会引发异常。 
  ●可运行态(Runnable) 
  start()方法产生运行线程所必须的资源,调度线程执行,并且调用线程的run 
()方法。在这时线程处于可运行态。该状态不称为运行态是因为这时的线程并不 
总是一直占用处理机。特别是对于只有一个处理机的PC而言,任何时刻只能有一个 
处于可运行态的线程占用处理 机。Java通过调度来实现多线程对处理机的共享。 

  ●非运行态(Not Runnable) 
  当以下事件发生时,线程进入非运行态。 
  ①suspend()方法被调用; 
  ②sleep()方法被调用; 
  ③线程使用wait()来等待条件变量; 
  ④线程处于I/O等待。 
  ●死亡态(Dead) 
  当run()方法返回,或别的线程调用stop()方法,线程进入死亡态 。通常Appl 
et使用它的stop()方法来终止它产生的所有线程。 

  (3)线程优先级 
  虽然我们说线程是并发运行的。然而事实常常并非如此。正如前面谈到的,当 
系统中只有一个cpu时,以某种顺序在单CPU情况下执行多线程被称为调度(schedu 
ling)。Java采用的是一种简单、固定的调度法,即固定优先级调度。这种算法是 
根据处于可运行态线程的相对优先级来实行调度。当线程产生时,它继承原线程的 
优先级。在需要时可对优先级进行修改。在任何时刻,如果有多条线程等待运行, 
系统选择优先级最高的可运行线程运行。只有当它停止、自动放弃、或由于某种 
原因成为非运行态低优先级的线程才能运行。如果两个线程具有相同的优先级,它 
们将被交替地运行。 
  Java实时系统的线程调度算法还是强制性的,在任何时刻,如果一个比其他线 
程优先级都高的线程的状态变为可运行态,实时系统将选择该线程来运行。 

  (4)幽灵线程 
  任何一个Java线程都能成为幽灵线程。它是作为运行于同一个进程内的对象 
和线程的服务提供者。例如,HotJava浏览器有一个称为" 后台图片阅读器"的幽灵 
线程,它为需要图片的对象和线程从文件系统或网络读入图片。 
  幽灵线程是应用中典型的独立线程。它为同一应用中的其他对象和线程提供 
服务。幽灵线程的run()方法一般都是无限循环,等待服务请求。 

  (5)线程组 
  每个Java线程都是某个线程组的成员。线程组提供一种机制,使得多个线程集 
于一个对象内,能对它们实行整体操作。譬如,你能用一个方法调用来启动或挂起 
组内的所有线程。Java线程组由ThreadGroup类实现。 
  当线程产生时,可以指定线程组或由实时系统将其放入某个缺省的线程组内。 
线程只能属于一个线程组,并且当线程产生后不能改变它所属的线程组。 

  3.多线程程序 

  对于多线程的好处这就不多说了。但是,它同样也带来了某些新的麻烦。只要 
在设计程序时特别小心留意,克服这些麻烦并不算太困难。 

  (1)同步线程 
  许多线程在执行中必须考虑与其他线程之间共享数据或协调执行状态。这就 
需要同步机制。在Java中每个对象都有一把锁与之对应。但Java不提供单独的lo 
ck和unlock操作。它由高层的结构隐式实现, 来保证操作的对应。(然而,我们注 
意到Java虚拟机提供单独的monito renter和monitorexit指令来实现lock和unlo 
ck操作。) 
  synchronized语句计算一个对象引用,试图对该对象完成锁操作, 并且在完成 
锁操作前停止处理。当锁操作完成synchronized语句体得到执行。当语句体执行 
完毕(无论正常或异常),解锁操作自动完成。作为面向对象的语言,synchronized 
经常与方法连用。一种比较好的办法是,如果某个变量由一个线程赋值并由别的线 
程引用或赋值,那么所有对该变量的访问都必须在某个synchromized语句或synch 
ronized方法内。 
  现在假设一种情况:线程1与线程2都要访问某个数据区,并且要求线程1的访 
问先于线程2, 则这时仅用synchronized是不能解决问题的。这在unix或Windows 
NT中可用Simaphore来实现。而Java并不提供。在Java中提供的是wait()和noti 
fy()机制。使用如下: 
  synchronized method-1(…){ call by thread 1. 
  ∥access data area; 
  available=true; 
  notify() 
  } 
  synchronized method-2(…){∥call by thread 2. 
  while(!available) 
  try{ 
  wait();∥wait for notify(). 
  }catch (Interrupted Exception e){ 
  } 
  ∥access data area 
  } 
  其中available是类成员变量,置初值为false。 
  如果在method-2中检查available为假,则调用wait()。wait()的作用是使线 
程2进入非运行态,并且解锁。在这种情况下,method-1可以被线程1调用。当执行 
notify()后。线程2由非运行态转变为可运行态。当method-1调用返回后。线程2 
可重新对该对象加锁,加锁成功后执行wait()返回后的指令。这种机制也能适用于 
其他更复杂的情况。 

  (2)死锁 
  如果程序中有几个竞争资源的并发线程,那么保证均衡是很重要的。系统均衡 
是指每个线程在执行过程中都能充分访问有限的资源。系统中没有饿死和死锁的 
线程。Java并不提供对死锁的检测机制。对大多数的Java程序员来说防止死锁是 
一种较好的选择。最简单的防止死锁的方法是对竞争的资源引入序号,如果一个线 
程需要几个资源,那么它必须先得到小序号的资源,再申请大序号的资源。 

关于怎样实现Java线程的深入探讨就分享到这里了,希望以上内容可以对大家有一定的帮助,可以学到更多知识。如果觉得文章不错,可以把它分享出去让更多的人看到。

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

怎样实现Java线程的深入探讨

下载Word文档到电脑,方便收藏和打印~

下载Word文档

猜你喜欢

怎样实现Java线程的深入探讨

这篇文章将为大家详细讲解有关怎样实现Java线程的深入探讨,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。1.什么是线程   一般来说,我们把正在计算机中执行的程序叫做"进程"(Proces
2023-06-03

怎样进行Java线程控制权源代码的深入探讨

怎样进行Java线程控制权源代码的深入探讨,相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。Java线程控制权的问题十分重要,我们在不断的学习中需要不断的注意相关的问题。下面我们就
2023-06-17

如何进行Java多线程同步机制的深入探讨

今天就跟大家聊聊有关如何进行Java多线程同步机制的深入探讨,可能很多人都不太了解,为了让大家更加了解,小编给大家总结了以下内容,希望大家根据这篇文章可以有所收获。在很多程序员的脑海中Java多线程都会占据一定的位置,众所周知,在Java多
2023-06-17

深入探讨Go语言线程与进程的区别

go 语言中,线程与进程的主要区别在于:内存空间:线程共享进程的内存空间,而进程拥有自己的独立内存空间。重量级:线程重量级较轻,进程重量级较重。操作系统管理:进程受操作系统管理,线程不受操作系统管理。通信方式:线程通过共享内存通信,进程通过
深入探讨Go语言线程与进程的区别
2024-04-04

深入探讨:Go语言中的单线程特性

Go语言作为一种现代化的编程语言,以其简洁高效的特性在近年来受到越来越多开发者的喜爱和青睐。其中一个让人独特的地方就是其单线程特性。在传统的多线程编程语言中,开发者通常需要手动管理线程之间的同步和互斥,而在Go语言中,借助其独特的协程(Go
深入探讨:Go语言中的单线程特性
2024-03-15

深入探讨 PHP 中防抖机制的实现方法

防抖机制是一种常用于避免函数频繁触发的技术,特别是在用户交互操作中。在 PHP 中,防抖机制可以用来处理用户连续点击或频繁触发的函数调用,从而有效地降低服务器的压力和提升用户体验。本文将深入探讨 PHP 中防抖机制的实现方法,并提供具体的代
2023-10-21

深入探讨PyCharm中自动换行的机制及实现

在软件开发中,PyCharm是一款被广泛使用的集成开发环境。它能够为开发者提供丰富的功能和工具,使得编程变得更加高效和愉快。其中,自动换行功能是PyCharm中的一个重要特性,本文将深度解读自动换行的原理和实现,并提供具体的代码示例。自动
深入探讨PyCharm中自动换行的机制及实现
2024-02-24

深入探讨Go语言中chan通道的实现原理

Go语言作为一种并发编程语言,具有轻量级线程(goroutine)和通道(channel)等特性,其中通道是一种用于在goroutine之间传递数据的重要机制。在本文中,我们将深入探讨Go语言中chan通道的实现原理,并结合具体的代码示例进
深入探讨Go语言中chan通道的实现原理
2024-03-13

深入探究Go语言从反射到元编程的实践与探讨

反射和元编程是一些高级编程概念,它们使开发者能够在运行时检查、修改并控制程序的行为,了解反射和元编程的工作方式可以帮助我们更好地理解Go,以及如何在需要的时候高效地使用它们,文章中介绍的非常详细,感兴趣的同学可以参考下
2023-05-19

深入探讨Go语言同步机制的原理与实现

Go语言作为一种面向并发编程的语言,在其同步机制设计中引入了goroutine、channel以及select语句等特性,使得并发编程变得更加容易和高效。本文将深入探讨Go语言同步机制的原理与实现,并结合具体的代码示例进行讲解。1. Go
深入探讨Go语言同步机制的原理与实现
2024-03-02

深入理解Java编程线程池的实现原理

在前面的文章中,我们使用线程的时候就去创建一个线程,这样实现起来非常简便,但是就会有一个问题:如果并发的线程数量很多,并且每个线程都是执行一个时间很短的任务就结束了,这样频繁创建线程就会大大降低系统的效率,因为频繁创建线程和销毁线程需要时间
2023-05-30

深入探讨Golang实时更新功能的原理及实现机制

Golang热更新原理浅析:探讨实时更新功能的实现机制,需要具体代码示例随着软件的发展,实时更新功能成为了许多开发者和用户所期望的一个重要特性。Golang作为一门现代化的编程语言,自然也需要具备这样的能力。本文将对Golang热更新的原
深入探讨Golang实时更新功能的原理及实现机制
2024-01-20

编程热搜

  • Python 学习之路 - Python
    一、安装Python34Windows在Python官网(https://www.python.org/downloads/)下载安装包并安装。Python的默认安装路径是:C:\Python34配置环境变量:【右键计算机】--》【属性】-
    Python 学习之路 - Python
  • chatgpt的中文全称是什么
    chatgpt的中文全称是生成型预训练变换模型。ChatGPT是什么ChatGPT是美国人工智能研究实验室OpenAI开发的一种全新聊天机器人模型,它能够通过学习和理解人类的语言来进行对话,还能根据聊天的上下文进行互动,并协助人类完成一系列
    chatgpt的中文全称是什么
  • C/C++中extern函数使用详解
  • C/C++可变参数的使用
    可变参数的使用方法远远不止以下几种,不过在C,C++中使用可变参数时要小心,在使用printf()等函数时传入的参数个数一定不能比前面的格式化字符串中的’%’符号个数少,否则会产生访问越界,运气不好的话还会导致程序崩溃
    C/C++可变参数的使用
  • css样式文件该放在哪里
  • php中数组下标必须是连续的吗
  • Python 3 教程
    Python 3 教程 Python 的 3.0 版本,常被称为 Python 3000,或简称 Py3k。相对于 Python 的早期版本,这是一个较大的升级。为了不带入过多的累赘,Python 3.0 在设计的时候没有考虑向下兼容。 Python
    Python 3 教程
  • Python pip包管理
    一、前言    在Python中, 安装第三方模块是通过 setuptools 这个工具完成的。 Python有两个封装了 setuptools的包管理工具: easy_install  和  pip , 目前官方推荐使用 pip。    
    Python pip包管理
  • ubuntu如何重新编译内核
  • 改善Java代码之慎用java动态编译

目录