刘志梅201771010115.《面向对象程序设计(java)》第十六周学习总结(代码片段)

lzm7343 lzm7343     2023-02-04     242

关键词:

实验十六  线程技术

实验时间 2017-12-8

1、实验目的与要求

(1)当线程的run方法执行方法体中最后一条语句后,并经由执行return语句返回时,或者出现了在方法中没有捕获的异常时,线程将终止。

当对一个线程调用interrupt方法时,线程的中断状态将被置位。

每个线程都应该检查boolean标志,以判断线程是否被中断。

如果线程被阻塞,无法检测中断状态。

当在一个被阻塞的线程上调用interrupt方法时,阻塞调用将会被interrupt Exception异常中断。 

(2) 线程的6种状态:New(新创建)、Runnable(可运行)、Bloced(被阻塞)、Waiting(等待)、Timed waiting(计时等待)、Terminated(被终止)。

当一个线程处于新创建状态时,程序还没有开始运行程序中的代码。

一旦调用start方法,线程处于runnable状态。

一个可运行的线程可能正在运行也可能没有运行,这取决于操作系统给线程提供运行的时间。

在具有多个处理器的机器上,每一个处理器运行一个线程,可以有多个线程并行运行。

当一个线程试图获取一个内部的对象锁,而该锁被其他线程持有,则该线程进入阻塞状态;当一个线程等待另一个线程通知调度器一个条件时,它自己进入等待状态;有几个方法有一个超时参数,调用它们线程进入计时等待状态。

线程被终止的原因有如下两个:因为run方法正常退出而自然死亡;因为一个没有捕获的异常终止了run方法而意外死亡。

(3) 线程属性包括:线程优先级、守护线程、线程组以及处理未捕获异常的处理器。

JAVA程序设计语言中,每一个线程有一个优先级;默认情况下,一个线程继承它的父线程的优先级,可以用setPriority方法提高或降低任何一个线程的优先级。

优先级可以设置为在MIN_PRIORITY(在Thread的类中定义为1)与MAX_PRIORITY(定义为10)之间的任何值;NORM_PRIORITY被定义为5。

可以通过调用t.setDaemon(true);将线程转换为守护线程。

线程的run方法不能抛出任何受查异常,但是,非受查异常会导致线程终止。

线程组是一个可以统一管理的线程集合。

(4) 在大多数实际的多线程应用中,两个或两个以上的线程需要共享对同一数据的存取;如果两个线程存取相同的对象,并且每一个线程都调用了一个修改该对象状态的方法,此时这种情况称为竞争条件。

(5) 每一个Back对象都有自己的ReentrantLock对象,如果两个线程试图访问同一个Back对象,那么锁以串行方式提供服务。

锁和条件的关键之处:锁用来保护代码片段,任何时刻只能有一个线程执行被保护的代码;锁可以管理任何试图进入被保护代码段的线程;锁可以拥有一个或多个相关的条件对象;每个条件对象管理那些已经进入被保护的代码段但还不能运行的线程。

内部锁和条件存在的一些局限:不能中断一个正在试图获得锁的线程;试图获得锁时不能设定超时;每个锁仅有单一的条件,这可能是不够的。

(6)监视器的特性:监视器是只包含私有域的类;每一个监视器类的对象都有一个相关的锁;使用该锁对所有的方法进行加锁;该锁可以有任意多个相关条件。

在下述三个方面java对象不同于监视器,从而使得线程的安全性下降:域不要求必须是private;方法不要求必须是synchronized;内部锁对客户是可用的。

Volatile关键字为实例域的同步访问提供了一种免锁机制。

除非使用锁或Volatile修饰符,否则无法从多个线程安全的读取一个域。

假设对共享变量除了赋值之外并不完成其它操作,那么可以将这些共享变量声明为Volatile。

如果另一个线程也在更新largest,就可能阻止这个线程更新。

有可能因为每一个线程要等待更多的钱款存入而导致所有线程都阻塞,这样的状态被称为死锁。

(7)Swing不是线程安全的。

将线程与Swing一起使用时,必须遵守的两个简单原则:如果一个动作需要花费很长时间,在一个独立的工作器线程中做这件事不要在事件分配线程中做;除了事件分配线程,不要在任何线程中接触Swing组件。

2、实验内容和步骤

实验1:测试程序并进行代码注释。

测试程序1:

elipse IDE中调试运行ThreadTest,结合程序运行结果理解程序;

掌握线程概念;

掌握用Thread的扩展类实现线程的方法;

利用Runnable接口改造程序,掌握用Runnable接口创建线程的方法。

class Lefthand extends Thread

   public void run()

   

       for(int i=0;i<=5;i++)

         System.out.println("You are Students!");

           try   sleep(500);   

           catch(InterruptedException e)

            System.out.println("Lefthand error.");    

       

  

class Righthand extends Thread

    public void run()

    

         for(int i=0;i<=5;i++)

            System.out.println("I am a Teacher!");

             try  sleep(300);  

             catch(InterruptedException e)

              System.out.println("Righthand error.");

         

    

public class ThreadTest

     static Lefthand left;

     static Righthand right;

     public static void main(String[] args)

          left=new Lefthand();

           right=new Righthand();

           left.start();

           right.start();

     

 

class Lefthand implements Runnable 
    public void run() 
        for (int i = 0; i <= 5; i++) 
            System.out.println("You are Students!");
            try 
                Thread.sleep(500);
             // 休眠时间为500毫秒
            catch (InterruptedException e)// 阻塞状态
            
                System.out.println("Lefthand error.");
            
        
    


class Righthand implements Runnable 
    public void run() 
        for (int i = 0; i <= 5; i++) 
            System.out.println("I am a Teacher!");
            try 
                Thread.sleep(300);
             // 休眠时间为300毫秒
            catch (InterruptedException e) 
                System.out.println("Righthand error.");
             //
        
    


public class thresdtest 

    private static Runnable Right;

    public static void main(String[] args)
    
        Righthand righthand = new Righthand();
        Thread right = new Thread(righthand);
        right.start();
        Lefthand lefthand=new Lefthand();
        Thread left = new Thread(lefthand);
        left.start();
        
    

修改后:

class Lefthand implements Runnable 
    public void run() 
        for (int i = 0; i <= 5; i++) 
            System.out.println("You are Students!");
            try 
                Thread.sleep(500);
             // 休眠时间为500毫秒
            catch (InterruptedException e)// 阻塞状态
            
                System.out.println("Lefthand error.");
            
        
    


class Righthand implements Runnable 
    public void run() 
        for (int i = 0; i <= 5; i++) 
            System.out.println("I am a Teacher!");
            try 
                Thread.sleep(300);
             // 休眠时间为300毫秒
            catch (InterruptedException e) 
                System.out.println("Righthand error.");
             //
        
    


public class thresdtest 

    private static Runnable Right;

    public static void main(String[] args)
    
        Righthand righthand = new Righthand();
        Lefthand lefthand=new Lefthand();
        Thread right = new Thread(righthand);
        Thread left = new Thread(lefthand);
        right.start();
        left.start();
        
    

 

测试程序2

Elipse环境下调试教材625页程序14-114-2 14-3,结合程序运行结果理解程序;

Elipse环境下调试教材631页程序14-4,结合程序运行结果理解程序;

对比两个程序,理解线程的概念和用途;

掌握线程创建的两种技术。

技术分享图片

技术分享图片

测试程序3分析以下程序运行结果并理解程序。

class Race extends Thread

  public static void main(String args[])

    Race[] runner=new Race[4];

    for(int i=0;i<4;i++) runner[i]=new Race( );

   for(int i=0;i<4;i++) runner[i].start( );

   runner[1].setPriority(MIN_PRIORITY);

   runner[3].setPriority(MAX_PRIORITY);

  public void run( )

      for(int i=0; i<1000000; i++);

      System.out.println(getName()+"线程的优先级是"+getPriority()+"已计算完毕!");

    

技术分享图片

测试程序4

教材642页程序模拟一个有若干账户的银行,随机地生成在这些账户之间转移钱款的交易。每一个账户有一个线程。在每一笔交易中,会从线程所服务的账户中随机转移一定数目的钱款到另一个随机账户。

Elipse环境下调试教材642页程序14-514-6,结合程序运行结果理解程序;

技术分享图片

综合编程练习

编程练习1

1. 设计一个用户信息采集程序,要求如下:

(1) 用户信息输入界面如下图所示:

(2) 用户点击提交按钮时,用户输入信息显示控制台界面;

(3) 用户点击重置按钮后,清空用户已输入信息;

(4) 点击窗口关闭,程序退出。

2.创建两个线程,每个线程按顺序输出5“你好”,每个“你好”要标明来自哪个线程及其顺序号。

3. 完善实验十五 GUI综合编程练习程序。

 

刘志梅201771010115.《面向对象程序设计(java)》第六周学习总结

实验六继承定义与使用实验时间2018-9-281、实验目的与要求(1)继承的定义:用已有类来构建新类的一种机制。当定义了一个新类继承了一个类时,这个新类就继承了这个类的方法和域,同时在新类中添加新的方法和域以适应新的... 查看详情

刘志梅201771010115《面向对象程序设计(java)》第七周学习总结

实验七继承附加实验实验时间2018-10-111、实验目的与要求(1)进一步理解4个成员访问权限修饰符的用途:即将类中的域标记为private,而方法标记为public。任何声明为private的内容对其他类都是不可见的。超类中的某些方法允许被... 查看详情

刘志梅201771010115.《面向对象程序设计(java)》第二周学习总结

实验二Java基本程序设计(1)实验时间2018-9-6第一部分:理论知识学习3.1一个简单的Java应用程序关键字public称为访问修饰符,这些修饰符用于控制程序的其他部分对这段代码的访问级别;关键字class表明java程序中的全部内容都包... 查看详情

刘志梅201771010115.《面向对象程序设计(java)》第十四周学习总结(代码片段)

实验十四 Swing图形界面组件实验时间20178-11-291、实验目的与要求(1)设计模式:反复使用、经过分类编目的、代码设计经验的总结。在Alexander的模式分类和软件模式的分类中,每种模式都遵循一种特定的格式。模型-视图-控制... 查看详情

刘志梅201771010115.《面向对象程序设计(java)》第十五周学习总结(代码片段)

实验十五 GUI编程练习与应用程序部署实验时间2018-12-61、实验目的与要求(1)一个JAR文件既可以包含类文件,也可以包含诸如图像和声音这些其他类型的文件。创建一个新的JAR文件应该使用的常见命令格式:jarcvfJARFileNameFile1File... 查看详情

刘志梅201771010115《面向对象程序设计(java)》第十八周学习总结(代码片段)

实验十八总复习实验时间2018-12-301、实验理论知识(1)第一个关键词:public称为访问修饰符,用于控制程序的其他部分对代码的访问级别。第二个关键词:class表明java程序中的全部内容都包含在类中。第三个关键词:main方法必须声... 查看详情

刘志梅201771010115.《面向对象程序设计(java)》第十六周学习总结(代码片段)

实验十六 线程技术实验时间2017-12-81、实验目的与要求(1)当线程的run方法执行方法体中最后一条语句后,并经由执行return语句返回时,或者出现了在方法中没有捕获的异常时,线程将终止。当对一个线程调用interrupt方法时,... 查看详情

刘志梅2017710101152.《面向对象程序设计(java)》第十三周学习总结(代码片段)

实验十三 图形界面事件处理技术实验时间2018-11-221、理论知识(1)任何支持GUI的操作环境都要不断地监视按键或点击鼠标这样的事件。JAVA这样的面向对象语言,都将事件的相关的信息封装在一个事件对象中。不同的事件源可以... 查看详情

刘志梅2017710101152《面向对象程序设计(java)》第十周学习总结(代码片段)

实验十  泛型程序设计技术实验时间2018-11-11、实验目的与要求(1)泛型程序设计:意味着编写的代码可以被很多不同类型的对象所重用。(ArrayList类可以聚集任何类型的对象)如果在其它地方,若将get的结果强制类型转换... 查看详情

面向对象程序设计介绍以及面向对象的基本特征

  面向对象的程序设计(ObjectOrientedProgramming,OOP)方法是目前比较流行的程序设计方法,和面向过程的程序设计比,它更符合人类的自然思维方式。在面向过程程序设计中,程序=数据+算法,数据和对数据的操作是分离的,如... 查看详情

《面向对象程序设计概述》牛咏梅

面向对象程序设计概述牛咏梅(南阳理工学院河南南阳473000)摘要:分析传统程序设计方法与面向对象程序设计方法之间的差别,重点分析了面向对象程序设计方法的特点,介绍了面向对象程序设计方法的步骤及其优点。关键词:面向对... 查看详情

java面向对象大致梳理

...概述:Java设计语言面向对象:Java语言是一种面向对象的程序设计语言,而面向对象思想是一种程序设计思想,我们在面向对象思想的指引下,使用Java语言去设计、开发计算机程序。这里的对象泛指现实中一切事物,每种事物都... 查看详情

面向对象的程序设计

阅读目录一面向对象的程序设计的由来二什么是面向对象的程序设计及为什么要有它三类与对象四属性查找五绑定到对象的方法的特殊之处六对象之间的交互七练习八继承与派生九多态与多态性十封装十一绑定方法与非绑定方法... 查看详情

面向对象思想

...0年代,位于美国加州的Xerox研究中心推出smalltalk语言及其程序设计环境,使得面向对象程序设计方法得到比较完善的实现,掀起了面向对象研究的高潮。到80年代中后期,面向对象的软件设计和程序设计方法 查看详情

面向对象设计----软件设计师

上午12分下午两大答题30分面向对象的基本概念❤❤❤❤❤采用面向对象的软件开发,通常由面向对象分析,面向对象设计,面向对象实现1面向对象分析OOA:获取对应用问题的理解,主要任务是抽取和整理用户需求并建立问题域精确模... 查看详情

面向对象分析与设计面向对象设计包括哪些内容

一、总述面向对象分析的输入是用户的功能需求,输出是简单的、理性化的分析模型,此阶段的工作更多侧重于如何理解软件的功能需求;面向对象设计的输入是面向对象分析的结果,蔬菜水果最终的、细化后的设计模型,此阶... 查看详情

面向对象思想初识

面向对象思想概述Java语言是一种面向对象的程序设计语言,而面向对象思想是一种程序设计思想,我们在面向对象思想的指引下,使用Java语言去设计、开发计算机程序。这里的对象泛指现实中一切事物,每种事物都具备自己的... 查看详情

面向过程程序设计,面向对象程序设计,可视化程序设计的异同

...开-闭原则。也使代码更易阅读。相对而言,面向过程的程序设计是面向对象程序设计的基础。面向对象的程序里面一定会有面向过程的程序片断的!可视化程序设计主要是一种技术 参考技术B这些是阶梯型向上发展的,一个比一... 查看详情