`
burnquist
  • 浏览: 69278 次
  • 性别: Icon_minigender_1
  • 来自: 重庆
社区版块
存档分类

对java中的线程感想

    博客分类:
  • WEB
阅读更多
对java中的线程感想


1.进程和线程的区别

   通俗一点说,进程就是程序的一次执行,而线程可以理解为进程中的执行的一段程序片段。

   用一点文词说就是,每个进程都有独立的代码和数据空间(进程上下文);而线程可以看成是轻量级的进程。一般来讲(不使用特殊技术),同一进程所产生的线程共享同一块内存空间。

   同一进程中的两段代码是不可能同时执行的,除非引入线程。

   线程是属于进程的,当进程退出时该进程所产生的线程都会被强制退出并清除。
   线程占用的资源要少于进程所占用的资源。
   进程和线程都可以有优先级。
   在线程系统中进程也是一个线程。可以将进程理解为一个程序的第一个线程。

   多进程-----在操作系统中,能同时运行多个任务(程序)。

   多线程-----在同一应用程序中,有多个顺序流同时执行。



2.通过铁路售票程序来理解实现多线程的两种方法:通过java.lang.Thread类和通过Runnable接口



java中有两种实现多线程的方式。一是直接继承Thread类,二是实现Runnable接口。那么这两种实现多线程的方式在应用上有什么区别呢?

        为了回答这个问题,我们可以通过编写一段代码来进行分析。我们用代码来模拟铁路售票系统,实现通过四个售票点发售某日某次列车的100张车票,一个售票点用一个线程表示。

        我们首先这样编写这个程序:

public class ThreadDome1{
  public static void main(String[] args){
    ThreadTest t = new ThreadTest();
    t.start();
    t.start();
    t.start();
    t.start();
  }
}

class ThreadTest extends Thread{
  private int ticket = 100;
  public void run(){
    while(true){
      if(ticket > 0){
        System.out.println(Thread.currentThread().getName() +
          "is saling ticket" + ticket--);
      }else{
        break;
      }
    }
  }
}

上面的代码中,我们用ThreadTest类模拟售票处的售票过程,run方法中的每一次循环都将总票数减1,模拟卖出一张车票,同时该车票号打印出来,直接剩余的票数到零为止。在ThreadDemo1类的main方法中,我们创建了一个线程对象,并重复启动四次,希望通过这种方式产生四个线程。从运行的结果来看我们发现其实只有一个线程在运行,这个结果告诉我们:一个线程对象只能启动一个线程,无论你调用多少遍start()方法,结果只有一个线程。

      我们接着修改ThreadDemo1,在main方法中创建四个Thread对象:

public class ThreadDemo1{
  public static void main(String[] args){
    new ThreadTest().start();
    new ThreadTest().start();
    new ThreadTest().start();
    new ThreadTest().start();
  }
}

class ThreadTest extends Thread{
  private int ticket = 100;
  public void run(){
    while(true){
      if(ticket > 0){
        System.out.println(Thread.currentThread().getName() +
           " is saling ticket" + ticket--);
      }else{
        break;
      }
    }
  }
}

     这下达到目的了吗?

     从结果上看每个票号都被打印了四次,即四个线程各自卖各自的100张票,而不去卖共同的100张票。这种情况是怎么造成的呢?我们需要的是,多个线程去处理同一个资源,一个资源只能对应一个对象,在上面的程序中,我们创建了四个ThreadTest对象,就等于创建了四个资源,每个资源都有100张票,每个线程都在独自处理各自的资源。

     经过这些实验和分析,可以总结出,要实现这个铁路售票程序,我们只能创建一个资源对象,但要创建多个线程去处理同一个资源对象,并且每个线程上所运行的是相同的程序代码。在回顾一下使用接口编写多线程的过程。

public class ThreadDemo1{
  public static void main(String[] args){
    ThreadTest t = new ThreadTest();
    new Thread(t).start();
    new Thread(t).start();
    new Thread(t).start();
    new Thread(t).start();
  }
}

class ThreadTest implements Runnable{
  private int tickets = 100;
  public void run(){
    while(true){
      if(tickets > 0){
        System.out.println(Thread.currentThread().getName() +
          " is saling ticket " + tickets--);
      }
    }
  }
}
  
上面的程序中,创建了四个线程,每个线程调用的是同一个ThreadTest对象中的run()方法,访问的是同一个对象中的变量(tickets)的实例,这个程序满足了我们的需求。在Windows上可以启动多个记事本程序一样,也就是多个进程使用同一个记事本程序代码。

       可见,实现Runnable接口相对于继承Thread类来说,有如下显著的好处:

(1)适合多个相同程序代码的线程去处理同一资源的情况,把虚拟CPU(线程)同程序的代码,数据有效的分离,较好地体现了面向对象的设计思想。

(2)可以避免由于Java的单继承特性带来的局限。我们经常碰到这样一种情况,即当我们要将已经继承了某一个类的子类放入多线程中,由于一个类不能同时有两个父类,所以不能用继承Thread类的方式,那么,这个类就只能采用实现Runnable接口的方式了。

(3)有利于程序的健壮性,代码能够被多个线程共享,代码与数据是独立的。当多个线程的执行代码来自同一个类的实例时,即称它们共享相同的代码。多个线程操作相同的数据,与它们的代码无关。当共享访问相同的对象时,即它们共享相同的数据。当线程被构造时,需要的代码和数据通过一个对象作为构造函数实参传递进去,这个对象就是一个实现了Runnable接口的类的实例。



文章转载自:http://news.newhua.com/news1/program_net/2009/29/09291444214H0095KI32IIB72BEA9CDG7GFH95729HI19CJ5KCKI133.html
分享到:
评论

相关推荐

    实验八:Java多线程

    通过本实验的学习,加深了对线程与进程概念的理解,并掌握了多线程在Java中的具体实现方法。特别是对临界区、对象锁、互斥与同步等核心概念有了更深入的认识,这对于编写高效、稳定的多线程程序至关重要。 #### 七...

    对Java程序设计的感想.doc

    在实际项目开发中,Java 的优势在于其强大的库支持和社区资源,如Spring框架、Hibernate ORM等,这些工具和框架极大地简化了开发流程,提高了开发效率。此外,Java 还提供了丰富的网络编程、数据库操作和并发处理的...

    李兴华老师学习java的感想

    他还建议学生深入学习并发编程,因为多线程是现代软件开发中的常态,理解并发和同步机制有助于写出高效且安全的代码。 在实际项目中,李老师提倡动手实践,认为“实践出真知”。他鼓励学生参与开源项目,通过实际...

    Java实习周报通用25篇

    通过这五个礼拜的实习,实习生不仅掌握了Java编程的基础和高级知识,也锻炼了实际问题解决能力,对软件开发流程有了初步认识。这为他们后续的学习和职业生涯打下了坚实的基础。在实习过程中,不断挑战自我,适应新...

    对JAVA程序设计的感想.pdf

    线程机制使得Java程序能够并行处理任务,提高效率,如在文件自动保存功能中,可以利用Timer类的schedule方法实现定时操作。 Java程序设计不仅涉及编程技术,还涉及到软件工程的实践,如良好的代码组织和类的设计。...

    JAVA论文 简易浏览器与JAVA思想

    这篇名为“JAVA论文 简易浏览器与JAVA思想”的文档主要涵盖了使用JAVA语言开发一个简易浏览器的实践过程,以及在开发过程中所体现的JAVA编程思想。作者韩公达通过这个项目,深入探讨了JAVA在实际应用中的核心概念,...

    java笔记图解10

    3. **听课感想.pdf**:这份文件可能是作者在学习Java过程中对课程或者讲座的个人感悟和理解,包含了对某个主题的深度思考和反馈。通过阅读这样的笔记,我们可以了解作者对Java学习过程中的难点、重点和关键点的理解...

    java笔记图解11

    "听课感想.pdf"可能包含的是学习过程中的个人理解和感悟,这在学习过程中非常重要,因为它能帮助我们巩固知识,发现自己的弱点,并从中提炼出实际应用中的技巧和经验。 最后,"study_CoreJava.pdf"很可能是一份详尽...

    java笔记图解12

    2. **听课感想.pdf** - 这可能是一位讲师或学生对课程的反馈和思考,可能包含了学习Java GUI编程时遇到的问题、解决方案、理解难点以及个人见解,对于学习者来说是一种宝贵的参考材料。 3. **study_CoreJava.pdf** ...

    java实习报告.pdf

    同时,掌握了Java企业级编程规范,包括代码风格、异常处理、多线程编程等。 - Java面向对象:深入理解类、对象、继承、封装、多态等概念,以及如何使用JDK提供的核心API,如集合框架、IO流、网络编程等。 - 在线考试...

    阿里面试经历感想回顾总结

    在面试中,Java的数据结构是面试官经常关注的重点,特别是对于有经验的开发者。LinkedList、ArrayList、HashMap 和 TreeMap 是Java集合框架中常见的数据结构,它们各有特点和适用场景。 1. **LinkedList**:...

    3160104875-杨樾人-web服务器1

    此外,这个项目还能帮助学习者深化对Java编程语言特性的理解,如I/O流、网络通信和线程管理。 1.2 设计说明 在Java中实现Web服务器,首先需要理解HTTP协议,它是Web服务器和浏览器之间通信的基础。服务器需要解析...

    操作系统进程同步和互斥的实验报告

    操作系统进程同步和互斥是操作系统中至关重要的概念,它们确保了多进程或多线程环境下的资源有效管理和安全访问。本实验报告详细介绍了如何通过编程实现这一机制,并以生产者-消费者问题为实例进行演示。 实验的...

    debug学习心得

    - 在调试过程中,如果当前线程已经处于某个断点处,使用Resume可以让程序继续运行至下一个断点。 6. **Hit Count**:设置断点时可以指定触发次数,只有达到指定次数后才会暂停。 7. **Inspect**:查看当前变量的值...

    Hibernate学习心得

    Hibernate是Java开发中的一款强大的对象关系映射(ORM)框架,它为开发者提供了一种在Java应用程序中操作数据库的面向对象方式,极大地简化了数据库操作的复杂性。通过使用Hibernate,开发者可以避免直接编写SQL语句...

    端口扫描程序的设计说明.doc

    第三章总结与心得部分,作者可能分享了完成项目后的感想,总结了设计过程中的挑战和解决方案,以及从中学到的网络编程和安全知识。这部分内容有助于读者理解作者的成长和项目的价值。 总的来说,端口扫描程序的设计...

    中南大学仿“滴滴物流”移动应用开发报告.pdf

    - **实验感想**:分享了通过本次课程设计所学到的知识和技能,以及对未来学习方向的思考。 该项目不仅展示了移动应用开发的基础知识和技术,还涉及到了服务器端开发、数据库管理和软件架构设计等多个方面,是一次...

    项目报告1

    - 在报告的第16页,团队可能会讨论在开发过程中遇到的挑战,如性能优化、内存管理、线程同步等问题,以及他们如何通过学习和实践找到解决方案。 4. **思考及感想**: - 在第19页,团队成员分享他们的项目经验,...

    DailyMomentApp

    【描述】:“DailyMomentApp”是一个用Java语言编写的日常记录应用,旨在帮助用户捕捉生活中的点滴时刻,记录日常感想,提供便利的日程管理和提醒功能。这个应用程序可能包含了前端用户界面、后端服务器逻辑以及...

Global site tag (gtag.js) - Google Analytics