`
hbkh2000
  • 浏览: 203687 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
社区版块
存档分类
最新评论

浅析Java多线程程序设计机制

阅读更多

多线程是Java语言的一大特性,多线程就是同时存在N个执行体,按几条不同的执行线索共同工作的情况。程序,进程,线程,可以从不同的角度去理解。程序就是一段静态的代码,可以理解成一组计算机命令的集合.进行就是这个程序一次动态的执行过程,从代码的加载到执行完毕的一个过程。线程是一个比进程小的单位,一个进程再执行的过程中可以产生多个线程,每个线程也是由生产到销毁,可以理解成是进行的子集。我个人用一个觉得还算恰当的比喻来比喻三者。QQ客户端就是一个程序,登陆一个QQ就是开始了这个程序的一个进程,再QQ上发送消息给好友就貌似这个进程中的一个线程。不知道这样比喻恰当否?

  线程也是有状态和声明周期的,每个Java程序都会有一个缺省的主线程,对于应用程序applcation来说main方法就是一个主线程.Java语言使用的是Thread类及其子类的对象来表示线程的.创建一个新的线程的生命周期如下状态:

  1) 新建:当一个Thread类或者其子类的对象被声明并创建时,新的线程对象处于新建状态,此时它已经有了相应的内存空间和其他资源.

  2) 就绪:处于新建状态的线程被启动后,将进入线程队列排队等待CUP服务,这个时候具备了运行的条件,一旦轮到CPU的时候,就可以脱离创建它的主线程独立开始自己的生命周期.

  3) 运行:就绪的线程被调度并获得CUP的处理边进入了运行状态,每一个Thread类及其子类的对象都有一个重要的run()方法,当线程对象被调度执行的时候,它将自动调用本对象的run()方法,从第一句代码开始执行。所以说对线程的操作应该写到run()方法中.

  4) 阻塞:一个正在执行的线程如果再某种情况下不能执行了.进入阻塞状态,这个时候它不能进入排队状态,只有引起了阻塞的原因消失的时候,线程才可以继续进入排队状态等待CUP处理。

  5) 死亡:处于死亡状态的线程不具有继续执行的能力,线程死亡主要的原因是正常运行的线程完成了全部工作,即执行完了run()方法,另外就是被提前强制的终止了。

  线程的调度也是有优先级别的,就是说同样的排列优先级高可以提前被CPU处理,主要分三个级别,高中低.分别代表的数字是10.5.1分别有三个常量代表不可以被改变。最小优先级的常量是MIN_PRIORITY,普通的优先级的常量是NORM_PRIORITY,最高的优先级的常量是MAX_PRIORITY一般主线程的优先级是普通,另外可以通过Thread类的setPriority(int a)方法来修改系统自动设置的线程优先级。

  Java中编程实现多线程应有两种途径,一种是创建自己的线程子类,另外是实现一个接口Runnable。无论是那种途径最终读需要使用Thread类及其方法。Thread类有两种构造方法,public Thread()用来创建一个线程对象。public Thread(Runnable r)创建线程对象,参数r成为被创建的目标对象。这个目标必须实现Runnbale接口,给出该接口的run()方法的方法体,再方法体中操作.用两个构造方法创建完的线程就是一个新建的状态,等待处理.然后启动线程的start()方法,启动线程对象,线程进入排队状态也就是就绪状态.然后线程操作run()方法这个方法里的内容是被系统处理的内容.如果想使线程进入休眠状态可以调用sleep()方法,可以给一个参数,代表休眠的毫秒.如果给两个参数代表那秒。终止线程用yield()方法来完成.判断线程是否销毁可以用idAlive()方法判断线程是否活着。Runnable接口只有一个方法run()方法,我们实现这个接口把要操作的代码写到这个方法中,然后再把实现了整个接口的类的实例传给Therad类的构造方法即可操作线程。

  线程同步是一个再处理线程的时候需要注意的问题,同步方法要用synchronized关键字类修饰,被这个关键字修饰后,当一个线程A使用这个方法后,其它线程想使用这个方法就必须等待,知道线程A使用完该方法后方可使用.下面我写一个例子来说明线程同步,这个例子有两个线程会计和出纳,他们共同有一个账本.他们俩都可以存取方法对账本进行访问,会计使用存取方法的时候写入存钱的记录,出纳则写入取钱的记录。因此会计使用账本的时候出纳被禁止使用,反之也是如此。就是一个人使用另外一个人必须等待。下面我通过一个小程序Applet来实现这个事:

  import Java.applet.*.
  import Java.awt.*.
  import Java.awt.event.*.

  public class MyThread extends Applet implements Runnable
  {
   int money = 100.
   TextArea text1 = null.
   TextArea text2 = null.
   Thread Kuaiji = null.
   Thread Chuna = null.
   public void init()
   {
    Kuaiji = new Thread(this).
    Chuna = new Thread(this).
    text1 = new TextArea(20,8).
    text2 = new TextArea(20,8).
    add(text1).
    add(text2).
   }
   public void start()
   {
    Kuaiji.start().
    Chuna.start().
   }
   public synchronized void Cunqu(int number)
   {
    if(Thread.currentThread() == Kuaiji)
    {
     for(int i=1.i<=3.i )
     {
      money = money number.
      try {Thread.sleep(1000).}
      catch(Exception e){}
      text1.append("\n" money).
     }
    }
    else if(Thread.currentThread() == Chuna)
    {
     for(int i=1.i<=2.i )
     {
      money = money - number/2.
      try {Thread.sleep(1000).}
      catch(Exception e){}
      text2.append("\n" money).
     }
    }
   }
   public void run()
   {
    if(Thread.currentThread()==Kuaiji || Thread.currentThread()==Chuna)
    {
     for(int i=1.i<=3.i )
     {
      Cunqu(30).
     }
    }
   }
  }

  当一个线程使用同步方法中的某个变量,而此变量又需要其他线程修改后才能符合本线程的需要,那么可以再同步方法中使用wait()方法,使本线程等待,并允许其他线程使用这个同步方法.用notfyAll()方法同志所有的由于使用这个同步方法的处于等待的线程结束等待进入同步方法中运行,如果使使用notfy()就是单独同志一个线程进行同步方法进行活动.简单的理解就是wait()方法让线程等待,notfy()当一个线程运行,notfyAll()让全部线程运行。虽然Java支持多线程.一般线程不需要我们自己处理.但是也是需要了解和掌握的。再日后的项目中获取会根据不同情况,有不同的需求。

分享到:
评论

相关推荐

    JAVA 的多线程浅析.pdf

    ### JAVA的多线程浅析 ...总之,Java的多线程机制为开发者提供了强大的并发执行能力,但在享受其带来的效率提升的同时,也应对其中的挑战保持警惕,合理设计和实现多线程程序,以充分发挥Java语言的潜力。

    Java多线程文章系列.pdf

    #### 三、Java多线程程序设计初步 ##### 1. 线程的创建 - **继承Thread类**: - 重写`run()`方法。 - **实现Runnable接口**: - 实现`run()`方法。 - 将`Runnable`对象传递给`Thread`构造函数。 ##### 2. 线程的...

    浅析《Java程序设计》的微课设计与实现.zip

    在本压缩包中,主要包含了一份关于“浅析《Java程序设计》的微课设计与实现”的PDF文档,这显然是一份深入探讨如何利用微课技术来教授Java编程的资料。微课是一种短小精悍的教学模式,通常涵盖一个特定的主题或技能...

    浅析Java_Concurrency

    通过这些工具,Java程序员可以编写出既安全又高效的多线程程序。 在多线程编程中,原子操作是保证线程安全的最基本单元。原子操作是指不可分割的操作,即在执行过程中不会被其他线程中断。Java中的原子变量类,比如...

    浅析《Java程序设计》课程的整体教学设计.zip

    《Java程序设计》课程是计算机科学与技术领域中一门至关重要的基础课程,它为学生提供了掌握面向对象编程思想和实际编程技能的平台。本篇文章将深入探讨这门课程的整体教学设计,旨在提升教学效果,激发学生的学习...

    浅析多核处理器条件下的Java编程.pdf

    《浅析多核处理器条件下的Java编程》这篇文章探讨了如何利用Java语言的多线程特性在多核处理器环境下实现高效编程。多核处理器是现代计算机硬件的重要组成部分,它通过集成多个处理器核心,允许同时处理多个任务,...

    JAVA高级编程资料

    线程同步是多线程编程中的难点,包括synchronized关键字、wait/notify机制、Lock接口(如ReentrantLock)以及并发工具类(如Semaphore、CountDownLatch和CyclicBarrier)等,都是保证数据安全和避免竞态条件的关键。...

    Java程序与C语言的区分浅析_.docx

    Java程序与C语言之间的主要区别在于它们的设计哲学、语法特性以及对安全性、可移植性和效率的处理方式。这里我们将深入探讨这些差异。 首先,Java是一种面向对象的语言,而C语言则是面向过程的。这意味着在Java中,...

    java nio 原理浅析

    Netty是基于Java NIO的一个高性能、异步事件驱动的网络应用程序框架,它简化了开发复杂的网络应用,比如TCP和UDP协议的应用。 Netty的整体结构复杂且灵活,它包含了多种组件,如Bootstrap、Channel、EventLoopGroup...

    浅析Java方法传值和传引用问题

    在处理对象时,理解这个差异至关重要,尤其是在处理多线程环境或并发操作时,避免意外的共享状态修改是防止错误的关键。 总的来说,Java的方法参数传递机制对基本类型采用传值,对象类型采用“传引用”的方式。理解...

    职校Java语言教学浅析.pdf

    Java语言是一种广泛应用于各领域的编程语言,以其平台无关性、面向对象、安全性及多线程等特性备受青睐。在职业教育中,Java语言的教学面临诸多挑战,包括如何克服程序设计的抽象性和枯燥性,以及如何激发学生的学习...

    浅析Java、C/C++、JavaScript、PHP、Python分别用来开发什么?

    它具有跨平台性、面向对象、多线程等特性,深受开发者的喜爱。Java常用于开发桌面应用程序、服务器端程序、大型企业级应用以及Android平台上的应用程序。Java的发展带来了许多框架和技术,如Spring、Hibernate、Java...

    Java不可变类机制浅析

    Java中的不可变类机制是一种设计模式,用于创建对象在创建后其状态无法改变的类。不可变类在多线程环境中特别有用,因为它们天生线程安全,无需额外的同步措施。不可变类的一些典型例子包括`Integer`、`Long`和`...

    Java基础知识点 - 内容比较全面

    2. **Java多线程相关知识**:Java通过Thread类和Runnable接口支持多线程编程。线程间通信可以使用wait(), notify()和notifyAll()方法,以及锁(synchronized)、条件变量(java.util.concurrent.Condition)等机制。...

    Netty实现原理浅析.pdf

    2. **单Reactor多线程模型**:相较于单线程模型,这里引入了线程池用于处理复杂的业务逻辑。Reactor线程依然负责I/O事件的监听,但是具体的业务处理则交给工作线程去完成。这种方式能有效利用多核处理器的优势,提高...

    浅析面向对象语言C_与Java区别_王艳娟1

    而Java则是纯面向对象的语言,具有平台无关性、多线程特性,并且在设计时强调安全性。 1. **数据类型的不同**:Java中,变量要么是基本数据类型,要么是对象的引用;C++除了基本数据类型,还支持自定义类型如结构体...

    浅析Java设计模式编程中的单例模式和简单工厂模式

    而懒汉模式则是在首次调用`getInstance`时才创建实例,这种实现方式延迟了初始化,但在多线程环境下需要使用同步机制来保证线程安全,如双重检查锁定(DCL): ```java public class SingletonDemo { private ...

    浅析使用模型参数构造Java Swing组件.zip

    Java Swing是Java GUI(图形用户界面)开发的一个重要库,它提供了一系列的组件,用于创建桌面应用程序。在“浅析使用模型参数构造Java Swing组件”这个主题中,我们将深入探讨如何利用模型参数来构建和定制Swing...

    Java程序与C语言的区别浅析

    首先,Java 是一种面向对象的语言,它的设计目标是简洁、分布式、解释执行、健壮、安全、结构中立、可移植、高效、多线程和动态。这意味着 Java 程序主要通过对象和类进行编程,支持类的继承、封装和多态等面向对象...

    浅析Java中的set集合类型及其接口的用法

    如果在多线程环境中使用,需要通过同步或者其他并发控制机制来保证安全性。 总之,Java中的Set集合类型提供了存储不重复元素的功能,其中HashSet强调性能,而TreeSet强调有序性。了解它们的工作原理以及如何正确...

Global site tag (gtag.js) - Google Analytics