GVKun编程网logo

苏浪浪 201771010120《面向对象程序设计(java)》第八周学习总结(java面向对象程序设计苏守宝答案)

3

本文将分享苏浪浪201771010120《面向对象程序设计的详细内容,并且还将对java》第八周学习总结进行详尽解释,此外,我们还将为大家带来关于20165203《Java程序设计》第八周学习总结、2

本文将分享苏浪浪 201771010120《面向对象程序设计的详细内容,并且还将对java》第八周学习总结进行详尽解释,此外,我们还将为大家带来关于20165203《Java 程序设计》第八周学习总结、20165208 2017-2018-2 《Java 程序设计》第八周学习总结、20165215 2017-2018-2 《Java 程序设计》第八周学习总结、20165225《Java 程序设计》第八周学习总结的相关知识,希望对你有所帮助。

本文目录一览:

苏浪浪 201771010120《面向对象程序设计(java)》第八周学习总结(java面向对象程序设计苏守宝答案)

苏浪浪 201771010120《面向对象程序设计(java)》第八周学习总结(java面向对象程序设计苏守宝答案)

1、实验目的与要求

(1) 掌握接口定义方法;

(2) 掌握实现接口类的定义要求;

(3) 掌握实现了接口类的使用要求;

(4) 掌握程序回调设计模式;

(5) 掌握Comparator接口用法;

(6) 掌握对象浅层拷贝与深层拷贝方法;

(7) 掌握Lambda表达式语法;

(8) 了解内部类的用途及语法要求。

2、实验内容和步骤

实验1: 导入第6章示例程序,测试程序并进行代码注释。

测试程序1:

l 编辑、编译、调试运行阅读教材214页-215页程序6-1、6-2,理解程序并分析程序运行结果;

l 在程序中相关代码处添加新知识的注释。

l 掌握接口的实现用法;

l 掌握内置接口Compareable的用法。

package interfaces;

import java.util.*;

/**
 * This program demonstrates the use of the Comparable interface.
 * @version 1.30 2004-02-27
 * @author Cay Horstmann
 */
public class EmployeeSortTest
{
   public static void main(String[] args)
   {
      Employee[] staff = new Employee[3];

      staff[0] = new Employee("Harry Hacker", 35000);
      staff[1] = new Employee("Carl Cracker", 75000);
      staff[2] = new Employee("Tony Tester", 38000);

      Arrays.sort(staff);

      // 打印所有员工对象的信息
      for (Employee e : staff)
         System.out.println("name=" + e.getName() + ",salary=" + e.getSalary());
   }
}
package interfaces;

public class Employee implements Comparable<Employee>
{
   private String name;
   private double salary;

   public Employee(String name, double salary)
   {
      this.name = name;
      this.salary = salary;
   }

   public String getName()
   {
      return name;
   }

   public double getSalary()
   {
      return salary;
   }

   public void raiseSalary(double byPercent)
   {
      double raise = salary * byPercent / 100;
      salary += raise;
   }

   /**
    * Compares employees by salary
    * @param other another Employee object
    * @return a negative value if this employee has a lower salary than
    * otherObject, 0 if the salaries are the same, a positive value otherwise
    */
   public int compareTo(Employee other)//用这个对象与other作比较
   {
      return Double.compare(salary, other.salary);
   }
}

 

 

测试程序2:

l 编辑、编译、调试以下程序,结合程序运行结果理解程序;

interface  A

{

  double g=9.8;

  void show( );

}

class C implements A

{

  public void show( )

  {System.out.println("g="+g);}

}

 

class InterfaceTest

{

  public static void main(String[ ] args)

  {

       A a=new C( );

       a.show( );

       System.out.println("g="+C.g);

  }

}

package e;
interface A
{
double g=9.8;
void show( );
}
class C implements A
{
public void show( )
{System.out.println("g="+g);}
}

class InterfaceTest
{
public static void main(String[ ] args)
{
A a=new C( );//声明接口变量
a.show( );
System.out.println("g="+C.g);
}
}

 

测试程序3:

l 在elipse IDE中调试运行教材223页6-3,结合程序运行结果理解程序;

l 26行、36行代码参阅224页,详细内容涉及教材12章。

l 在程序中相关代码处添加新知识的注释。

l 掌握回调程序设计模式;

package timer;

/**
   @version 1.01 2015-05-12
   @author Cay Horstmann
*/

import java.awt.*;
import java.awt.event.*;
import java.util.*;
import javax.swing.*;
import javax.swing.Timer; 
// 用JavaUTIL计时器解决冲突

public class TimerTest
{  
   public static void main(String[] args)
   {  
      ActionListener listener = new TimePrinter();

      // 构建一个调用侦听器的计时器
      // 每10秒一次
      Timer t = new Timer(10000, listener);
      t.start();

      JOptionPane.showMessageDialog(null, "Quit program?");
      System.exit(0);
   }
}

class TimePrinter implements ActionListener
{  
   public void actionPerformed(ActionEvent event)
   {  
      System.out.println("At the tone, the time is " + new Date());
      Toolkit.getDefaultToolkit().beep();
   }
}

 

 

 

 

测试程序4:

l 调试运行教材229页-231页程序6-4、6-5,结合程序运行结果理解程序;

l 在程序中相关代码处添加新知识的注释。

l 掌握对象克隆实现技术;

l 掌握浅拷贝和深拷贝的差别。

package clone;

/**
 * This program demonstrates cloning.
 * @version 1.10 2002-07-01
 * @author Cay Horstmann
 */
public class CloneTest
{
   public static void main(String[] args)
   {
      try
      {
         Employee original = new Employee("John Q. Public", 50000);
         original.setHireDay(2000, 1, 1);
         Employee copy = original.clone();
         copy.raiseSalary(10);
         copy.setHireDay(2002, 12, 31);
         System.out.println("original=" + original);
         System.out.println("copy=" + copy);
      }
      catch (CloneNotSupportedException e)
      {
         e.printStackTrace();
      }
   }
}

 

package clone;

import java.util.Date;
import java.util.GregorianCalendar;

public class Employee implements Cloneable//实现Cloneable接口
{
   private String name;
   private double salary;
   private Date hireDay;

   public Employee(String name, double salary)
   {
      this.name = name;
      this.salary = salary;
      hireDay = new Date();
   }

   public Employee clone() throws CloneNotSupportedException//定义一个克隆方法
   {
      // call Object.clone()
      Employee cloned = (Employee) super.clone();// 继承object类

      // clone mutable fields
      cloned.hireDay = (Date) hireDay.clone();
      //cloned.name=(String)name.clone();String不具有克隆功能;
      return cloned;
   }

   /**
    * Set the hire day to a given date. 
    * @param year the year of the hire day
    * @param month the month of the hire day
    * @param day the day of the hire day
    */
   public void setHireDay(int year, int month, int day)
   {
      Date newHireDay = new GregorianCalendar(year, month - 1, day).getTime();
      
      // Example of instance field mutation
      hireDay.setTime(newHireDay.getTime());
   }

   public void raiseSalary(double byPercent)
   {
      double raise = salary * byPercent / 100;
      salary += raise;
   }

   public String toString()
   {
      return "Employee[name=" + name + ",salary=" + salary + ",hireDay=" + hireDay + "]";
   }
}

 

 

实验2: 导入第6章示例程序6-6,学习Lambda表达式用法。

l 调试运行教材233页-234页程序6-6,结合程序运行结果理解程序;

l 在程序中相关代码处添加新知识的注释。

l 将27-29行代码与教材223页程序对比,将27-29行代码与此程序对比,体会Lambda表达式的优点。

package lambda;

import java.util.*;

import javax.swing.*;
import javax.swing.Timer;

/**
 * This program demonstrates the use of lambda expressions.
 * @version 1.0 2015-05-12
 * @author Cay Horstmann
 */
public class LambdaTest
{
   public static void main(String[] args)
   {
      String[] planets = new String[] { "Mercury", "Venus", "Earth", "Mars", 
            "Jupiter", "Saturn", "Uranus", "Neptune" };
      System.out.println(Arrays.toString(planets));
      System.out.println("Sorted in dictionary order:");
      Arrays.sort(planets);
      System.out.println(Arrays.toString(planets));
      System.out.println("Sorted by length:");
      Arrays.sort(planets, (first, second) -> first.length() - second.length());
      System.out.println(Arrays.toString(planets));
            
      Timer t = new Timer(1000, event ->
         System.out.println("The time is " + new Date()));
      //event ->System.out.println("The time is " + new Date()));lambda表达式;
      t.start();   
         
      // keep program running until user selects "Ok"
      JOptionPane.showMessageDialog(null, "Quit program?");
      System.exit(0);         
   }
}

 

注:以下实验课后完成

实验3: 编程练习

l 编制一个程序,将身份证号.txt 中的信息读入到内存中;

l 按姓名字典序输出人员信息;

l 查询最大年龄的人员信息;

l 查询最小年龄人员信息;

l 输入你的年龄,查询身份证号.txt中年龄与你最近人的姓名、身份证号、年龄、性别和出生地;

l 查询人员中是否有你的同乡。

package aaa;

import java.io.BufferedReader;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collections;
import java.util.Scanner;

public class b{
    private static ArrayList<Student> studentlist;
    public static void main(String[] args) {
        studentlist = new ArrayList<>();
        Scanner scanner = new Scanner(System.in);
        File file = new File("E:身份证号.txt");
        try {
            FileInputStream fis = new FileInputStream(file);
            BufferedReader in = new BufferedReader(new InputStreamReader(fis));
            String temp = null;
            while ((temp = in.readLine()) != null) {
                
                Scanner linescanner = new Scanner(temp);
                
                linescanner.useDelimiter(" ");    
                String name = linescanner.next();
                String number = linescanner.next();
                String sex = linescanner.next();
                String age = linescanner.next();
                String province =linescanner.nextLine();
                Student student = new Student();
                student.setName(name);
                student.setnumber(number);
                student.setsex(sex);
                int a = Integer.parseInt(age);
                student.setage(a);
                student.setprovince(province);
                studentlist.add(student);

            }
        } catch (FileNotFoundException e) {
            System.out.println("学生信息文件找不到");
            e.printStackTrace();
        } catch (IOException e) {
            System.out.println("学生信息文件读取错误");
            e.printStackTrace();
        }
        boolean isTrue = true;
        while (isTrue) {
            System.out.println("选择你的操作, ");
            System.out.println("1.字典排序  ");
            System.out.println("2.输出年龄最大和年龄最小的人  ");
            System.out.println("3.寻找老乡  ");
            System.out.println("4.寻找年龄相近的人  ");
            System.out.println("5.退出 ");
            String m = scanner.next();
            switch (m) {
            case "1":
                Collections.sort(studentlist);              
                System.out.println(studentlist.toString());
                break;
            case "2":
                 int max=0,min=100;
                 int j,k1 = 0,k2=0;
                 for(int i=1;i<studentlist.size();i++)
                 {
                     j=studentlist.get(i).getage();
                 if(j>max)
                 {
                     max=j; 
                     k1=i;
                 }
                 if(j<min)
                 {
                   min=j; 
                   k2=i;
                 }
                 
                 }  
                 System.out.println("年龄最大:"+studentlist.get(k1));
                 System.out.println("年龄最小:"+studentlist.get(k2));
                break;
            case "3":
                 System.out.println("地址?");
                 String find = scanner.next();        
                 String place=find.substring(0,3);
                 for (int i = 0; i <studentlist.size(); i++) 
                 {
                     if(studentlist.get(i).getprovince().substring(1,4).equals(place)) 
                         System.out.println("老乡"+studentlist.get(i));
                 }             
                 break;
                 
            case "4":
                System.out.println("年龄:");
                int yourage = scanner.nextInt();
                int near=agenear(yourage);
                int value=yourage-studentlist.get(near).getage();
                System.out.println(""+studentlist.get(near));
                break;
            case "5 ":
                isTrue = false;
                System.out.println("退出程序!");
                break;
                default:
                System.out.println("输入有误");

            }
        }
    }
        public static int agenear(int age) {      
        int j=0,min=53,value=0,ok=0;
         for (int i = 0; i < studentlist.size(); i++)
         {
             value=studentlist.get(i).getage()-age;
             if(value<0) value=-value; 
             if (value<min) 
             {
                min=value;
                 ok=i;
             } 
          }    
         return ok;         
      }
}

 

package aaa;

public class Student implements Comparable<Student> {

    private String name;
    private String number ;
    private String sex ;
    private int age;
    private String province;
   
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
    public String getnumber() {
        return number;
    }
    public void setnumber(String number) {
        this.number = number;
    }
    public String getsex() {
        return sex ;
    }
    public void setsex(String sex ) {
        this.sex =sex ;
    }
    public int getage() {

        return age;
        }
        public void setage(int age) {
            // int a = Integer.parseInt(age);
        this.age= age;
        }

    public String getprovince() {
        return province;
    }
    public void setprovince(String province) {
        this.province=province ;
    }

    public int compareTo(Student o) {
       return this.name.compareTo(o.getName());
    }

    public String toString() {
        return  name+"\t"+sex+"\t"+age+"\t"+number+"\t"+province+"\n";
    }    
}

 

 

实验4:内部类语法验证实验

实验程序1:

l 编辑、调试运行教材246页-247页程序6-7,结合程序运行结果理解程序;

l 了解内部类的基本用法。

package innerClass;

import java.awt.*;
import java.awt.event.*;
import java.util.*;
import javax.swing.*;
import javax.swing.Timer;

/**
 * This program demonstrates the use of inner classes.
 * @version 1.11 2015-05-12
 * @author Cay Horstmann
 */
public class InnerClassTest
{
   public static void main(String[] args)
   {
      TalkingClock clock = new TalkingClock(1000, true);
      clock.start();

      // keep program running until user selects "Ok"
      JOptionPane.showMessageDialog(null, "Quit program?");
      System.exit(0);
   }
}

/**
 * A clock that prints the time in regular intervals.
 */
class TalkingClock
{
   private int interval;
   private boolean beep;

   /**
    * Constructs a talking clock
    * @param interval the interval between messages (in milliseconds)
    * @param beep true if the clock should beep
    */
   public TalkingClock(int interval, boolean beep)
   {
      this.interval = interval;
      this.beep = beep;
   }

   /**
    * Starts the clock.
    */
   public void start()
   {
      ActionListener listener = new TimePrinter();
      Timer t = new Timer(interval, listener);
      t.start();
   }

   public class TimePrinter implements ActionListener
   {
      public void actionPerformed(ActionEvent event)
      {
         System.out.println("At the tone, the time is " + new Date());
         if (beep) Toolkit.getDefaultToolkit().beep();
      }
   }
}

 

 

实验程序2:

l 编辑、调试运行教材254页程序6-8,结合程序运行结果理解程序;

l 了解匿名内部类的用法。

package anonymousInnerClass;

import java.awt.*;
import java.awt.event.*;
import java.util.*;
import javax.swing.*;
import javax.swing.Timer;

/**
 * This program demonstrates anonymous inner classes.
 * @version 1.11 2015-05-12
 * @author Cay Horstmann
 */
public class AnonymousInnerClassTest
{
   public static void main(String[] args)
   {
      TalkingClock clock = new TalkingClock();
      clock.start(1000, true);

      // keep program running until user selects "Ok"
      JOptionPane.showMessageDialog(null, "Quit program?");
      System.exit(0);
   }
}

/**
 * A clock that prints the time in regular intervals.
 */
class TalkingClock
{
   /**
    * Starts the clock.
    * @param interval the interval between messages (in milliseconds)
    * @param beep true if the clock should beep
    */
   public void start(int interval, boolean beep)
   {
      ActionListener listener = new ActionListener()
         {
            public void actionPerformed(ActionEvent event)
            {
               System.out.println("At the tone, the time is " + new Date());
               if (beep) Toolkit.getDefaultToolkit().beep();
            }
         };
      Timer t = new Timer(interval, listener);
      t.start();
   }
}

 

 

实验程序3:

l 在elipse IDE中调试运行教材257页-258页程序6-9,结合程序运行结果理解程序;

l 了解静态内部类的用法。

package staticInnerClass;

/**
 * This program demonstrates the use of static inner classes.
 * @version 1.02 2015-05-12
 * @author Cay Horstmann
 */
public class StaticInnerClassTest
{
   public static void main(String[] args)
   {
      double[] d = new double[20];
      for (int i = 0; i < d.length; i++)
         d[i] = 100 * Math.random();
      ArrayAlg.Pair p = ArrayAlg.minmax(d);
      System.out.println("min = " + p.getFirst());
      System.out.println("max = " + p.getSecond());
   }
}

class ArrayAlg
{
   /**
    * A pair of floating-point numbers
    */
   public static class Pair
   {
      private double first;
      private double second;

      /**
       * Constructs a pair from two floating-point numbers
       * @param f the first number
       * @param s the second number
       */
      public Pair(double f, double s)
      {
         first = f;
         second = s;
      }

      /**
       * Returns the first number of the pair
       * @return the first number
       */
      public double getFirst()
      {
         return first;
      }

      /**
       * Returns the second number of the pair
       * @return the second number
       */
      public double getSecond()
      {
         return second;
      }
   }

   /**
    * Computes both the minimum and the maximum of an array
    * @param values an array of floating-point numbers
    * @return a pair whose first element is the minimum and whose second element
    * is the maximum
    */
   public static Pair minmax(double[] values)
   {
      double min = Double.POSITIVE_INFINITY;
      double max = Double.NEGATIVE_INFINITY;
      for (double v : values)
      {
         if (min > v) min = v;
         if (max < v) max = v;
      }
      return new Pair(min, max);
   }
}

 

 

 

 

实验总结:

(1) 掌握了接口定义方法、实现接口类的定义要求、实现了接口类的使用要求;能够理解 程序回调设计模式;熟悉了Comparator接口用法、对象浅层拷贝与深层拷贝方法; 掌握了Lambda表达式语法;了解了内部类的用途及语法要求。  在助教学长以及老师的帮助下了解了许多新的知识,通过实验也熟悉了新的知识。       

 

20165203《Java 程序设计》第八周学习总结

20165203《Java 程序设计》第八周学习总结

20165203《Java 程序设计》第八周学习总结

教材学习内容总结

第 12 章

  • 进程与线程
    • 进程的完成过程:代码加载、执行至执行完毕
    • 线程:一个进程由多个线程组成。
    • 线程的完成过程:自身的产生、存在和消亡
    • 关系:没有进程就不会有线程
    • 线程是运行在进程中的小线程。
  • 线程
    • 多线程:几个执行体共同执行程序的过程。
    • 注意:计算机在任何给定的时刻只能执行那些线程中的一个。
    • 建立多线程机制:Java 虚拟机快速地把控制从一个线程切换到另一个线程,这些线程被轮流执行,每个线程都有机会使用 CPU 资源。
    • 主线程:JVM 加载代码时,发现 main 方法之后启动的线程
    • 线程的状态:
      新建
      运行:使用 start() 方法
      中断 死亡
  • 线程的创建
    两种方式:
  1. 使用 Thread 类子类创建:需要重写 run() 方法。
  2. 使用 Thread
    构造方法:Thread(Runable target)
    需要创建一个 Runnable 接口类的事例,并在该接口中重写 run 方法。
  • 目标对象与线程的关系:完全解耦和目标对象组合线程
  • 线程中的常用方法:
  1. start(): 注意使用 start() 方法后不必再让线程调用 start() 方法。
  2. run():Thread 子类中重写 run() 或在 Runnable接口中编写 run()
  3. sleep(int millsecond):使进程休眠。
    注意:参数 millsecond 是以毫秒为单位的休眠时间 必须在 try-catch 语句块中调用 sleep方法 4.isAlive(): 线程没有进入死亡状态,调用 isAlive() 方法返回 true
    线程进入死亡状态后,调用 isAlive() 方法返回 false 5.currentThread(): 返回正在使用 CPU 线程的线程。
    6.interrupt():解除线程的休眠状态。
  • 线程同步: 程序中的若干个线程都需要使用一个方法,而这个方法用 synchronized 给予了修饰。

  • 线程同步机制:线程 A 使用 synchronized 方法时,其他线程想使用这个 synchronized 方法必须等待,直到线程 A 使用完该 synchronized 方法。

  • 协调同步的线程:
    1.wait(): 在同步方法中使用,使本线程等待,暂时让出 CPU 的使用权。
    2.notifyAll():通知所有由于使用这个同步方法而处于等待的线程结束等待,曾中断的线程就会从刚才的中断处继续执行这个同步方法。
    3.notify(): 通知处于等待中的线程的某一个结束等待。
    ++ 必须在同步方法中使用这三种方法 ++

  • 线程联合
    join():其他线程调用该方法,可以和正在使用 CPU 资源的线程联合。

  • GUI 线程

  • 计时器线程:使用 Time类

  • 守护线程:使用 void setDaemon(boolean on) 方法

教材学习中的问题和解决过程

Q1:当学习教材时,前面的知识有所遗忘,不太了解 JVM 的具体含义?

A1:经过查阅教材,并上网查找之后,得到了比较全面的答案。
JVM 其实是 Java 虚拟机的缩写,是 Java 程序实现其 ++ 平台无关性 ++ 的关键,正是因为的 Java 的平台无关性使得 Java 语言编译程序只需生成在 Java 虚拟机上运行的目标代码 (字节码),就可以在多种平台上不加修改地运行。

Q2:当学习到如图所示时,对程序中的 currentThread() 方法提出了疑问。
A2:其实当我学习到后面,教材中对 currentThread() 方法做了解释,在这里我就说一下我自己打的理解,currentThread() 方法是 Thread 类中的方法,用于返回当前正在使用 CPU 资源的线程,和 getName() 一起用。

代码调试中的问题和解决过程

Q1:在运行程序 Example12_9.java 时,运行结果如图所示,与教材实例中给出的结果不符。

A1:自己仔细阅读教材,发现教材中给 catMaker 线程所赋名字有错误,如图所示。

代码托管

上周考试错题总结

Q1:接口 RowSet 继承了接口__,可以调用 RowSet 中的方法__来填充其数据区。 ①Statement ②ResultSet ③update ④populate
A . ①③
B . ①④
C . ②③
D . ②④

A1:正解:C
解析:与 ResultSet 相比较,
(1)RowSet 扩展了 ResultSet 接口,因此可以像使用 ResultSet 一样使用 RowSet。

  (2)RowSet 扩展了 ResultSet 接口,因此功能比 ResultSet 更多、更丰富。

  (3)默认情况下,所有 RowSet 对象都是可滚动的和可更新的。而 ResultSet 是只能向前滚动和只读的。

  (4)RowSet 可以是非链接的,而 ResultSet 是连接的。因此利用 CacheRowSet 接口可以离线操作数据。

  (5)RowSet 接口添加了对 JavaBeans 组件模型的 JDBC API 支持。rowset 可用作可视化 Bean 开发环境中的 JavaBeans 组件。

  (6)RowSet 采用了新的连接数据库的方法。
  update 常用于更新数据。

其他(感悟、思考等,可选)

本周的 Java 学习主要学习了线程,仿佛开启了新时代的大门,自我感觉线程非常有意思,自己正在尝 试用线程编写一些有意思的程序。另外,自己通过本周的学习也发现了前面的知识有些遗忘,要抓紧时间查漏补缺了。

## 学习进度条

~ 代码行数(新增 / 累积) 博客量(新增 / 累积) 学习时间(新增 / 累积) 重要成长
目标 5000 行 30 篇 400 小时
第一周 48/48 1/1 20/20
第二周 390/438 2/3 18/38
第三周 886/1304 1/4 18/56
第四周 1105/2409 1/5 30/86
第五周 1229/3196 1/6 20/106
第六周 1147/4343 2/8 25/131
第七周 1862/3668 1/9 20/151
第八周 955/5298 1/10 20/171

20165208 2017-2018-2 《Java 程序设计》第八周学习总结

20165208 2017-2018-2 《Java 程序设计》第八周学习总结

20165208 2017-2018-2 《Java 程序设计》第八周学习总结

教材学习内容总结

第十二章

线程状态

  • 创建线程对象
  1. 利用 Thread 类或子类直接创建:Thread(Runnable target) 创建线程,获取当前线程对象,getName() 返回线程的名称。
  2. 使用 Runnable 接口:相较于 Thread 更灵活
  • 运行 </br>run() 方法规定具体使命
  • 中断
  • 死亡

线程的常用方法

  • start():启动线程,只有新建的线程才可以调用
  • run():定义线程对象被调度后所执行的操作,是系统自动调用而用户不得引用的方法,需创建 Thread 类的子类重写覆盖原来的方法。
  • sleep(int millsecond):使优先级高的自动放弃 cpu 资源
  • isAlive():新建及死亡状态返回 false,run () 开始运行到结束之前调用返回 true
  • currentThread():返回正在使用 cpu 的线程
  • interrupt():重启动休眠的线程

线程同步

synchronized 修饰方法,则调用时须遵守同步机制

线程联合

join().B 使 A 联合 B, 即 A 线程中断执行直至 B 完成

GUI 线程

GUI:图形用户界面 </br> 主要涉及 AWT-EventQuecue(负责处理 GUI 事件)和 AWT-Windows(负责将窗体或组件绘制到桌面)

计时器线程

Timer(int a,Object b) 创建计时器,Timer 类的 start() 启动线程,stop() 停止,restart()重启恢复线程

教材学习中的问题和解决过程

问题一:p366 提到在创建线程时,Runnable 类比 Thread 子类更具有灵活性,但是不是很懂 Runnable 类要怎么用。

解决方法一:通过上网查阅资料学习,了解到实现 Runnable 接口的类必须使用 Thread 类的实例才能创建线程。通过 Runnable 接口创建线程分为两步:

  1. 将实现 Runnable 接口的类实例化。
  2. 建立一个 Thread 对象,并将第一步实例化后的对象作为参数传入 Thread 类的构造方法。

代码托管

上周考试错题总结

  1. 下面的选项不是关系数据库基本特征的是 </br>A. 不同的列应有不同的数据类型 </br>B. 不同的列应有不同的列名 </br>C. 与行的次序无关 </br>D. 与列的次序无关 </br > 正确答案为 A,该项不属于关系数据库的基本特征
  2. 下列属于数据操作语言的是 </br>A.insert </br>B.update </br>C.create </br>D.select </br > 此题为多选,除了 update 外,insert 也属于数据操作语言

其他(感悟、思考等,可选)

这一章主要学习了线程,多线程作为 Java 的特点之一,但是并不是指多个事件被同时处理,而本章的知识也更贴近具体问题,可以用来更好的表达及解决实际问题。

参考资料

  • 《Java2 实用教程(第五版)》学习指导

学习进度条

代码行数(新增 / 累积) 博客量(新增 / 累积) 学习时间(新增 / 累积) 重要成长
目标 5000 行 30 篇 400 小时
第一周 36/36 4/4 30/30
第二周 464/500 1/5 18/48
第三周 832/1332 2/7 17/65
第四周 939/2271 2/9 17/65
第五周 1163/3434 1/10 17/65
第六周 1176/4610 1/11 15/65
第七周 864/5474 2/12 15/80
第八周 703/6177 2/14 15/80

20165215 2017-2018-2 《Java 程序设计》第八周学习总结

20165215 2017-2018-2 《Java 程序设计》第八周学习总结

20165215 2017-2018-2 《Java 程序设计》第八周学习总结

教材学习内容总结

  • 进程与线程
    • 进程是程序的一次动态执行过程,它对应了从代码加载、执行至执行完毕的一个完整过程。
    • 线程是比进程更小的执行单位
  • Java 中的进程
    • 计算机在任何给定的时刻只能执行那些线程中的一个
    • Java 语言使用 Thread 类及其子类的对象来表示线程
    • 线程创建后仅仅是占用了内存资源,必须调用 start () 方法通知 JVM
    • 程序必须在子类中重写父类的 run () 方法
    • sleep (int millsecond) 方法使当前线程进入休眠状态,wait () 方法使当前线程进入等待状态
    • 所谓死亡状态就是线程释放了实体,即释放分配给线程对象的内存
  • Thread 类与线程的创建
    • 使用 Thread 创建线程通常使用的构造方法是 Thread(Runnable target)
    • 目标对象与线程完全解耦的情况下,目标对象需要通过获得线程的名字来确定能够是哪个线程正在占用 CPU;目标对象组合线程中,目标对象可以获得线程对象的引用
  • 常用方法
    • start();
    • run (), 在线程没有结束 run () 之前,不要再让线程调用 start () 方法,否则将发生 IllegalThreadStateException 异常
    • sleep (int millsecond) 必须在 try-catch 语句块中调用 sleep 方法
    • isAlive();
    • currentThread () 返回当前正在使用 CPU 资源的线程
    • interrupt();
  • 线程同步机制:当一个线程 A 使用 synchronized 方法时,时就必须等待,知道线程 A 使用完 synchronized 方法
  • 不可以在非同步方法中使用 wait (),notify (),notifyAll ()
  • A 在运行期间使用 Join () 联合 B,那么 A 线程立刻终端执行,一直等待 B 执行结束,A 再重新排队等待 CPU 资源
  • AWT-EventQuecue 线程负责处理 GUI 事件,AWT-Windows 线程负责将窗体或组件绘制到桌面

代码调试中的问题和解决过程

  • 问题 1:编译例子 1 是出现如下错误

  • 问题 1 解决方法:添加 encoding 参数:javac -encoding gbk Example12_1.java, 然后运行成功

代码托管

(statistics.sh 脚本的运行结果截图)

上周考试错题总结

  • 错题 1

  • 理解情况:Xammp 是一个功能强大的建站集成软件包,可以在其中创建数据库
  • 错题 2

  • 理解情况:数据操作语言是指对表中数据的查询、插入、删除和修改
  • 错题 3

  • 理解情况:java.sql.SQLException: Unknown column''sid'' in ''field list'' 意为 “字段列表” 中有未知列 “SID”

学习进度条

代码行数(新增 / 累积) 博客量(新增 / 累积) 学习时间(新增 / 累积) 重要成长
目标 5000 行 30 篇 400 小时
第一周 37/37 1/1 15/15
第二周 398/429 2/3 15/30
第三周 753/1167 1/4 20/50
第四周 1296/2109 2/6 20/70
第五周 1191/3323 2/8 20/90
第六周 1806/4390 2/10 15/105
第七周 1260/5145 2/12 15/120
第八周 606/5745 3/15 20/140

参考资料

  • 《Java2 实用教程(第五版)》

20165225《Java 程序设计》第八周学习总结

20165225《Java 程序设计》第八周学习总结

20165225《Java 程序设计》第八周学习总结


1. 视频与课本中的学习:

  • 第十二章学习总结

1.继承Thread类创建线程,程序中如果想要获取当前线程对象可以使用方法:Thread.currentThread();如果想要返回线程的名称,则可以使用方法:getName();

2.实现Runnable接口创建线程

3.使用CallableFuture创建线程

线程常用方法:
start()
run()定义线程线程对象被调度之后所执行的操作
sleep(int millsecond),必须在try-catch语句块中调用sleep方法
isAlive()

协调同步的常用方法:
wait()方法可以中断方法的执行,使本线程等待,暂时让出CPU的使用权,并允许其它线程使用这个同步方法
notifyAll()方法通知所有的由于使用这个同步方法而处于等待的线程结束等待。曾中断的线程就会从刚才的中断处继续执行这个同步方法,并遵循“先中断先继续”的原则

notify()方法只是通知处于等待中的线程的某一个结束等待
线程联合:一个线程A在占有CPU资源期间,可以让其它线程调用join()和本线程联合AWT-EventQuecue线程负责处理GUI事件,AWT-Windows线程负责将窗体或组件绘制到桌面

B.join()
若准备联合的B线程已经执行结束,则B.join()不会产生任何效果
使用Timer类的方法start()启动计时器,即启动线程。使用Timer类的方法stop()停止计时器,即挂起线程,使用restart()重新启动计时器,即恢复线程
守护线程:一个线程调用void setDaemon(boolean on)方法可以将自己设置成一个守护(Daemon)线程

thread.setDaemon(true);
当程序中的所有用户线程都已结束运行时,即使守护线程的run方法中还有需要执行的语句,守护线程也立刻结束运行

2. 代码托管:

image

3. 上周错题总结:

周一啦

4. 学习心得:

  • 线程死亡的时候,我也死亡了。

  • 周末愉快。

  • please buy No Tears Left to Cry on itunes!♪(´▽`)

image

今天关于苏浪浪 201771010120《面向对象程序设计java》第八周学习总结的介绍到此结束,谢谢您的阅读,有关20165203《Java 程序设计》第八周学习总结、20165208 2017-2018-2 《Java 程序设计》第八周学习总结、20165215 2017-2018-2 《Java 程序设计》第八周学习总结、20165225《Java 程序设计》第八周学习总结等更多相关知识的信息可以在本站进行查询。

本文标签: