• 杨玲 201771010133《面向对象程序设计(java)》第十六周学习总结


    《面向对象程序设计(java)》第十六周学习总结

    第一部分:理论知识学习部分

    1、程序是一段静态的代码,它是应用程序执行的蓝本。进程是程序的一次动态执行,它对应了从代码加载、执行至执行完毕的一个完整过程。操作系统为每个进程分配一段独立的内存空间和系统资源,包括:代码数据以及堆栈等资源。每一个进程的内部数据和状态都是完全独立的。多任务操作系统中,进程切换对CPU资源消耗较大。

    2、多线程是进程执行过程中产生的多条执行线索。线程是比进程执行更小的单位。线程不能独立存在,必须存在于进程中,同一进程的各线程间共享进程空间的数据。每个线程有它自身的产生、存在和消亡的过程,是一个动态的概念。多线程意味着一个程序的多行语句可以看上去几乎在同一时间内同时运行。线程创建、销毁和切换的负荷远小于进程,又称为轻量级进程。

    3、Java实现多线程有两种途径:创建Thread类的子类;在程序中定义实现Runnable接口的类。

    4、用Thread类的子类创建线程:首先需从Thread类派生出一个子类,在该子类中重写run()方法。然后用创建该子类的对象Lefthand left=new Lefthand(); Righthand right=new Righthand();最后用start()方法启动线程 left.start(); right.start();

    5、用Thread类的子类创建多线程的关键性操作:定义Thread类的子类并实现用户线程操作,即run()方法的实现。在适当的时候启动线程。由于Java只支持单重继承,用这种方法定义的类不可再继承其他父类。

    6、用Runnable()接口实现线程:首先设计一个实现Runnable接口的类;然后在类中根据需要重写run方法;再创建该类对象,以此对象为参数建立Thread 类的对象;调用Thread类对象的start方法启动线程,将 CPU执行权转交到run方法。

    7、Thread(Runnable r):创建一个新线程,它调用r的run(), r是一个实现了Runnable接口的类的实例。

    8、线程两种创建方法比较:实现Runnable接口的优势:符合OO设计的思想;便于用extends继承其它类。采用继承Thread类方法的优点:代码简单。

    9、线程的终止:当线程的run方法执行方法体中最后一条语句后,或者出现了在run方法中没有捕获的异常时,线程将终止,让出CPU使用权。调用interrupt()方法也可终止线程。 void interrupt() :向一个线程发送一个中断请求,同时把这个线程的“interrupted”状态置为true。若该线程处于 blocked 状 态,会抛出 InterruptedException。/10、测试线程是否被中断的方法:static boolean interrupted() :检测当前线程是否已被中断,并重置状态 “interrupted”值为false。  boolean isInterrupted() :检测当前线程是否已被中断 , 不改变状态 “interrupted”值 。

    二 实验部分

    第二部分:实验部分

    实验名称:实验十六  线程技术

    1、实验目的与要求

    (1) 掌握线程概念;

    (2) 掌握线程创建的两种技术;

    (3) 理解和掌握线程的优先级属性及调度方法;

    (4) 掌握线程同步的概念及实现技术;

    2、实验内容和步骤

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

    测试程序1:

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

    l 掌握线程概念;

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

    l 利用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();

         }

    }

     1 class Lefthand extends Thread { 
     2    public void run()
     3    {
     4        for(int i=0;i<=5;i++)
     5        {  System.out.println("You are Students!");
     6            try{   Thread.sleep(500);   }
     7            catch(InterruptedException e)
     8            { System.out.println("Lefthand error.");}    
     9        } 
    10   } 
    11 }
    12 class Righthand extends Thread {
    13     public void run()
    14     {
    15          for(int i=0;i<=5;i++)
    16          {   System.out.println("I am a Teacher!");
    17              try{  Thread.sleep(300);  }
    18              catch(InterruptedException e)
    19              { System.out.println("Righthand error.");}
    20          }
    21     }
    22 }
    23 public class ThreadTest 
    24 {
    25      static Lefthand left;
    26      static Righthand right;
    27      public static void main(String[] args)
    28      {   Runnable left = new Lefthand();
    29           Runnable right = new Righthand();
    30           Thread left1 = new Thread(left);
    31           Thread right1 = new Thread(right);
    32            left1.start();
    33            right1.start();
    34      }
    35 }

    运行结果如下:

    测试程序2

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

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

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

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

     1 package bounceThread;
     2 
     3 import java.awt.geom.*;
     4 
     5 /**
     6    A ball that moves and bounces off the edges of a 
     7    rectangle
     8  * @version 1.33 2007-05-17
     9  * @author Cay Horstmann
    10 */
    11 public class Ball
    12 {
    13    private static final int XSIZE = 15;//定义球的大小
    14    private static final int YSIZE = 15;
    15    private double x = 0;
    16    private double y = 0;
    17    private double dx = 1;
    18    private double dy = 1;
    19 
    20    /**
    21       Moves the ball to the next position, reversing direction
    22       if it hits one of the edges
    23    */
    24    public void move(Rectangle2D bounds)
    25    {
    26       x += dx;//定义球的运行轨迹大小
    27       y += dy;
    28       if (x < bounds.getMinX())
    29       { 
    30          x = bounds.getMinX();
    31          dx = -dx;
    32       }
    33       if (x + XSIZE >= bounds.getMaxX())
    34       {
    35          x = bounds.getMaxX() - XSIZE; 
    36          dx = -dx; 
    37       }
    38       if (y < bounds.getMinY())
    39       {
    40          y = bounds.getMinY(); 
    41          dy = -dy;
    42       }
    43       if (y + YSIZE >= bounds.getMaxY())
    44       {
    45          y = bounds.getMaxY() - YSIZE;
    46          dy = -dy; 
    47       }
    48    }
    49 
    50    /**
    51       Gets the shape of the ball at its current position.
    52    */
    53    public Ellipse2D getShape()
    54    {
    55       return new Ellipse2D.Double(x, y, XSIZE, YSIZE);
    56    }
    57 }
     1 package bounce;
     2 
     3 import java.awt.*;
     4 import java.util.*;
     5 import javax.swing.*;
     6 
     7 /**
     8  * The component that draws the balls.
     9  * @version 1.34 2012-01-26
    10  * @author Cay Horstmann
    11  */
    12 public class BallComponent extends JPanel
    13 {
    14    private static final int DEFAULT_WIDTH = 450;
    15    private static final int DEFAULT_HEIGHT = 350;
    16 
    17    private java.util.List<Ball> balls = new ArrayList<>();
    18 
    19    /**
    20     * Add a ball to the component.
    21     * @param b the ball to add
    22     */
    23    public void add(Ball b)
    24    {
    25       balls.add(b);
    26    }
    27 
    28    public void paintComponent(Graphics g)
    29    {
    30       super.paintComponent(g); // 擦除背景
    31       Graphics2D g2 = (Graphics2D) g;
    32       for (Ball b : balls)
    33       {
    34          g2.fill(b.getShape());
    35       }
    36    }
    37    
    38    public Dimension getPreferredSize() { return new Dimension(DEFAULT_WIDTH, DEFAULT_HEIGHT); }
    39 }
     1 package bounce;
     2 
     3 import java.awt.*;
     4 import java.awt.event.*;
     5 import javax.swing.*;
     6 
     7 /**
     8  * Shows an animated bouncing ball.
     9  * @version 1.34 2015-06-21
    10  * @author Cay Horstmann
    11  */
    12 public class Bounce
    13 {
    14    public static void main(String[] args)
    15    {
    16       EventQueue.invokeLater(() -> {
    17          JFrame frame = new BounceFrame();
    18          frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    19          frame.setVisible(true);
    20       });
    21    }
    22 }
    23 
    24 /**
    25  * The frame with ball component and buttons.
    26  */
    27 class BounceFrame extends JFrame
    28 {
    29    private BallComponent comp;
    30    public static final int STEPS = 1000;
    31    public static final int DELAY = 3;
    32 
    33    /**
    34     * Constructs the frame with the component for showing the bouncing ball and
    35     * Start and Close buttons
    36     */
    37    public BounceFrame()
    38    {
    39       setTitle("Bounce");//名称
    40       comp = new BallComponent();
    41       add(comp, BorderLayout.CENTER);//放在框架居中的位置
    42       JPanel buttonPanel = new JPanel();
    43       addButton(buttonPanel, "Start", event -> addBall());//将按钮组件添加到事件源容器中
    44       addButton(buttonPanel, "Close", event -> System.exit(0));
    45       add(buttonPanel, BorderLayout.SOUTH);//设置按钮的位置
    46       pack();
    47    }
    48 
    49    /**
    50     * Adds a button to a container.
    51     * @param c the container
    52     * @param title the button title
    53     * @param listener the action listener for the button
    54     */
    55    public void addButton(Container c, String title, ActionListener listener)
    56    {
    57       JButton button = new JButton(title);
    58       c.add(button);
    59       button.addActionListener(listener);
    60    }
    61 
    62    /**
    63     * Adds a bouncing ball to the panel and makes it bounce 1,000 times.
    64     */
    65    public void addBall()//以线程的方式
    66    {
    67       try
    68       {
    69          Ball ball = new Ball();
    70          comp.add(ball);
    71 
    72          for (int i = 1; i <= STEPS; i++)
    73          {
    74             ball.move(comp.getBounds());
    75             comp.paint(comp.getGraphics());
    76             Thread.sleep(DELAY);//休眠给定的毫秒数
    77          }
    78       }
    79       catch (InterruptedException e)
    80       {
    81       }
    82    }
    83 }
     1 package bounceThread;
     2 
     3 import java.awt.*;
     4 import java.util.*;
     5 import javax.swing.*;
     6 
     7 /**
     8  * The component that draws the balls.
     9  * @version 1.34 2012-01-26
    10  * @author Cay Horstmann
    11  */
    12 public class BallComponent extends JComponent
    13 {
    14    private static final int DEFAULT_WIDTH = 450;
    15    private static final int DEFAULT_HEIGHT = 350;
    16 
    17    private java.util.List<Ball> balls = new ArrayList<>();
    18 
    19    /**
    20     * Add a ball to the panel.
    21     * @param b the ball to add
    22     */
    23    public void add(Ball b)
    24    {
    25       balls.add(b);
    26    }
    27 
    28    public void paintComponent(Graphics g)
    29    {
    30       Graphics2D g2 = (Graphics2D) g;
    31       for (Ball b : balls)
    32       {
    33          g2.fill(b.getShape());
    34       }
    35    }
    36    
    37    public Dimension getPreferredSize() { return new Dimension(DEFAULT_WIDTH, DEFAULT_HEIGHT); }
    38 }
     1 package bounceThread;
     2 
     3 import java.awt.*;
     4 import java.awt.event.*;
     5 
     6 import javax.swing.*;
     7 
     8 /**
     9  * Shows animated bouncing balls.
    10  * @version 1.34 2015-06-21
    11  * @author Cay Horstmann
    12  */
    13 public class BounceThread
    14 {
    15    public static void main(String[] args)
    16    {
    17       EventQueue.invokeLater(() -> {
    18          JFrame frame = new BounceFrame();
    19          frame.setTitle("BounceThread");
    20          frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    21          frame.setVisible(true);
    22       });
    23    }
    24 }
    25 
    26 /**
    27  * The frame with panel and buttons.
    28  */
    29 class BounceFrame extends JFrame
    30 {
    31    private BallComponent comp;
    32    public static final int STEPS = 1000;
    33    public static final int DELAY = 5;
    34 
    35 
    36    /**
    37     * Constructs the frame with the component for showing the bouncing ball and
    38     * Start and Close buttons
    39     */
    40    public BounceFrame()
    41    {
    42       comp = new BallComponent();
    43       add(comp, BorderLayout.CENTER);
    44       JPanel buttonPanel = new JPanel();
    45       addButton(buttonPanel, "Start", event -> addBall());
    46       addButton(buttonPanel, "Close", event -> System.exit(0));
    47       add(buttonPanel, BorderLayout.SOUTH);
    48       pack();
    49    }
    50 
    51    /**
    52     * Adds a button to a container.
    53     * @param c the container
    54     * @param title the button title
    55     * @param listener the action listener for the button
    56     */
    57    public void addButton(Container c, String title, ActionListener listener)
    58    {
    59       JButton button = new JButton(title);
    60       c.add(button);
    61       button.addActionListener(listener);
    62    }
    63 
    64    /**
    65     * Adds a bouncing ball to the canvas and starts a thread to make it bounce
    66     */
    67    public void addBall()//用匿名内部类
    68    {
    69       Ball ball = new Ball();
    70       comp.add(ball);
    71       Runnable r = () -> { 
    72          try
    73          {  
    74             for (int i = 1; i <= STEPS; i++)
    75             {
    76                ball.move(comp.getBounds());
    77                comp.repaint();
    78                Thread.sleep(DELAY);
    79             }
    80          }
    81          catch (InterruptedException e)
    82          {
    83          }
    84       };
    85       Thread t = new Thread(r);//构造一个新线程,用于给定目标的run()方法
    86       t.start();//启动这个线程,将引发调用run方法。这个方法将立即返回,并且新线程将并发运行
    87    }
    88 }

    运行结果如下:

    测试程序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()+"已计算完毕!");

        }

    }

     1 class Race extends Thread {
     2     public static void main(String args[]) {
     3         Race[] runner = new Race[4];
     4         for (int i = 0; i < 4; i++)
     5             runner[i] = new Race();
     6         for (int i = 0; i < 4; i++)
     7             runner[i].start();
     8         runner[1].setPriority(MIN_PRIORITY);
     9         runner[3].setPriority(MAX_PRIORITY);
    10     }
    11 
    12     public void run() {
    13         for (int i = 0; i < 1000000; i++);//延时作用----执行空语句(不释放CPU)
    14         System.out.println(getName() + "线程的优先级是" + getPriority() + "已计算完毕!");
    15     }
    16 }

    运行结果如下:

    测试程序4

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

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

     1 package unsynch;
     2 
     3 import java.util.*;
     4 
     5 /**
     6  * A bank with a number of bank accounts.
     7  * @version 1.30 2004-08-01
     8  * @author Cay Horstmann
     9  */
    10 public class Bank
    11 {
    12    private final double[] accounts;
    13 
    14    /**
    15     * Constructs the bank.
    16     * @param n the number of accounts
    17     * @param initialBalance the initial balance for each account
    18     */
    19    public Bank(int n, double initialBalance)
    20    {
    21       accounts = new double[n];
    22       Arrays.fill(accounts, initialBalance);
    23    }
    24 
    25    /**
    26     * Transfers money from one account to another.
    27     * @param from the account to transfer from
    28     * @param to the account to transfer to
    29     * @param amount the amount to transfer
    30     */
    31    public void transfer(int from, int to, double amount)
    32    {
    33       if (accounts[from] < amount) return;
    34       System.out.print(Thread.currentThread());
    35       accounts[from] -= amount;
    36       System.out.printf(" %10.2f from %d to %d", amount, from, to);
    37       accounts[to] += amount;
    38       System.out.printf(" Total Balance: %10.2f%n", getTotalBalance());
    39    }
    40 
    41    /**
    42     * Gets the sum of all account balances.
    43     * @return the total balance
    44     */
    45    public double getTotalBalance()
    46    {
    47       double sum = 0;
    48 
    49       for (double a : accounts)
    50          sum += a;
    51 
    52       return sum;
    53    }
    54 
    55    /**
    56     * Gets the number of accounts in the bank.
    57     * @return the number of accounts
    58     */
    59    public int size()
    60    {
    61       return accounts.length;
    62    }
    63 }
     1 package unsynch;
     2 
     3 /**
     4  * This program shows data corruption when multiple threads access a data structure.
     5  * @version 1.31 2015-06-21
     6  * @author Cay Horstmann
     7  */
     8 public class UnsynchBankTest
     9 {
    10    public static final int NACCOUNTS = 100;
    11    public static final double INITIAL_BALANCE = 1000;
    12    public static final double MAX_AMOUNT = 1000;
    13    public static final int DELAY = 10;
    14    
    15    public static void main(String[] args)
    16    {
    17       Bank bank = new Bank(NACCOUNTS, INITIAL_BALANCE);
    18       for (int i = 0; i < NACCOUNTS; i++)
    19       {
    20          int fromAccount = i;
    21          Runnable r = () -> {
    22             try
    23             {
    24                while (true)
    25                {
    26                   int toAccount = (int) (bank.size() * Math.random());
    27                   double amount = MAX_AMOUNT * Math.random();
    28                   bank.transfer(fromAccount, toAccount, amount);
    29                   Thread.sleep((int) (DELAY * Math.random()));
    30                }
    31             }
    32             catch (InterruptedException e)
    33             {
    34             }            
    35          };
    36          Thread t = new Thread(r);//构造一个新线程,用于给定目标的run()方法
    37          t.start();//启动这个线程,将引发调用run方法。这个方法将立即返回,并且新线程将并发运行
    38       }
    39    }
    40 }

    运行结果如下:

    综合编程练习

    编程练习1

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

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

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

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

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

      1  2 
      3 import java.awt.Dimension;
      4 import java.awt.FlowLayout;
      5 import java.awt.GridLayout;
      6 
      7 import javax.swing.BorderFactory;
      8 import javax.swing.ButtonGroup;
      9 import javax.swing.JButton;
     10 import javax.swing.JCheckBox;
     11 import javax.swing.JComboBox;
     12 import javax.swing.JFrame;
     13 import javax.swing.JLabel;
     14 import javax.swing.JPanel;
     15 import javax.swing.JRadioButton;
     16 import javax.swing.JTextField;
     17 
     18 public class DemoJFrame extends JFrame {
     19     private JPanel jPanel1;
     20     private JPanel jPanel2;
     21     private JPanel jPanel3;
     22     private JPanel jPanel4;
     23     private JTextField fieldname;
     24     private JComboBox comboBox;
     25     private JTextField fieldadress;
     26     private ButtonGroup bg;
     27     private JRadioButton Male;
     28     private JRadioButton Female;
     29     private JCheckBox read;
     30     private JCheckBox sing;
     31     private JCheckBox dance;
     32 
     33     public DemoJFrame() {
     34         // 设置窗口大小
     35         this.setSize(800, 400);
     36         // 设置可见性
     37         this.setVisible(true);
     38         // 设置标题
     39         this.setTitle("编程练习一");
     40         // 设置关闭操作
     41         this.setDefaultCloseOperation(EXIT_ON_CLOSE);
     42         // 设置窗口居中
     43         WinCenter.center(this);
     44         // 创建四个面板对象
     45         jPanel1 = new JPanel();
     46         setJPanel1(jPanel1);                
     47         jPanel2 = new JPanel();
     48         setJPanel2(jPanel2);
     49         jPanel3 = new JPanel();
     50         setJPanel3(jPanel3);
     51         jPanel4 = new JPanel();
     52         setJPanel4(jPanel4);
     53         // 设置容器的为流布局
     54         FlowLayout flowLayout = new FlowLayout();
     55         this.setLayout(flowLayout);
     56         // 将四个面板添加到容器中
     57         this.add(jPanel1);
     58         this.add(jPanel2);
     59         this.add(jPanel3);
     60         this.add(jPanel4);
     61 
     62     }
     63 
     64     /*
     65      * 设置面一
     66      */
     67     private void setJPanel1(JPanel jPanel) {
     68         // TODO 自动生成的方法存根
     69         jPanel.setPreferredSize(new Dimension(700, 45));
     70         // 给面板的布局设置为网格布局 一行4列
     71         jPanel.setLayout(new GridLayout(1, 4));
     72         
     73         JLabel name = new JLabel("name:");
     74         name.setSize(100, 50);
     75         fieldname = new JTextField("");
     76         fieldname.setSize(80, 20);
     77         
     78         JLabel study = new JLabel("qualification:");
     79         comboBox = new JComboBox();
     80         comboBox.addItem("初中");
     81         comboBox.addItem("高中");
     82         comboBox.addItem("本科");
     83         jPanel.add(name);
     84         jPanel.add(fieldname);
     85         jPanel.add(study);
     86         jPanel.add(comboBox);
     87 
     88     }
     89 
     90     /*
     91      * 设置面板二
     92      */
     93     private void setJPanel2(JPanel jPanel) {
     94         // TODO 自动生成的方法存根
     95         jPanel.setPreferredSize(new Dimension(700, 50));
     96         // 给面板的布局设置为网格布局 一行4列
     97         jPanel.setLayout(new GridLayout(1, 4));
     98         
     99         JLabel name = new JLabel("address:");
    100         fieldadress = new JTextField();
    101         fieldadress.setPreferredSize(new Dimension(150, 50));
    102         
    103         JLabel study = new JLabel("hobby:");
    104         JPanel selectBox = new JPanel();
    105         selectBox.setBorder(BorderFactory.createTitledBorder(""));
    106         selectBox.setLayout(new GridLayout(3, 1));
    107         read = new JCheckBox("reading");
    108         sing = new JCheckBox("singing");
    109         dance = new JCheckBox("danceing");
    110         selectBox.add(read);
    111         selectBox.add(sing);
    112         selectBox.add(dance);
    113         jPanel.add(name);
    114         jPanel.add(fieldadress);
    115         jPanel.add(study);
    116         jPanel.add(selectBox);
    117     }
    118 
    119     /*
    120      * 设置面板三
    121      */
    122     private void setJPanel3(JPanel jPanel) {
    123         // TODO 自动生成的方法存根
    124         jPanel.setPreferredSize(new Dimension(700, 150));
    125         FlowLayout flowLayout = new FlowLayout(FlowLayout.LEFT);
    126         jPanel.setLayout(flowLayout);
    127         JLabel sex = new JLabel("性别:");
    128         JPanel selectBox = new JPanel();
    129         selectBox.setBorder(BorderFactory.createTitledBorder(""));
    130         selectBox.setLayout(new GridLayout(2, 1));
    131         bg = new ButtonGroup();
    132         Male = new JRadioButton("male");
    133         Female = new JRadioButton("female");
    134         bg.add(Male );
    135         bg.add(Female);
    136         selectBox.add(Male);
    137         selectBox.add(Female);
    138         jPanel.add(sex);
    139         jPanel.add(selectBox);
    140 
    141     }
    142 
    143     /*
    144      * 设置面板四
    145      */
    146     private void setJPanel4(JPanel jPanel) {
    147         // TODO 自动生成的方法存根
    148         jPanel.setPreferredSize(new Dimension(700, 150));
    149         FlowLayout flowLayout = new FlowLayout(FlowLayout.CENTER, 50, 10);
    150         jPanel.setLayout(flowLayout);
    151         jPanel.setLayout(flowLayout);
    152         JButton sublite = new JButton("提交");
    153         JButton reset = new JButton("重置");
    154         sublite.addActionListener((e) -> valiData());
    155         reset.addActionListener((e) -> Reset());
    156         jPanel.add(sublite);
    157         jPanel.add(reset);
    158     }
    159 
    160     /*
    161      * 提交数据
    162      */
    163     private void valiData() {
    164         // TODO 自动生成的方法存根
    165         // 拿到数据
    166         String name = fieldname.getText().toString().trim();
    167         String xueli = comboBox.getSelectedItem().toString().trim();
    168         String address = fieldadress.getText().toString().trim();
    169         System.out.println(name);
    170         System.out.println(xueli);
    171         String hobbystring="";
    172         if (read.isSelected()) {
    173             hobbystring+="reading   ";
    174         }
    175         if (sing.isSelected()) {
    176             hobbystring+="singing   ";
    177         }
    178         if (dance.isSelected()) {
    179             hobbystring+="dancing  ";
    180         }
    181         System.out.println(address);
    182         if (Male.isSelected()) {
    183             System.out.println("male");
    184         }
    185         if (Female.isSelected()) {
    186             System.out.println("female");
    187         }
    188         System.out.println(hobbystring);
    189     }
    190 
    191     /*
    192      * 重置
    193      */
    194     private void Reset() {
    195         // TODO 自动生成的方法存根
    196         fieldadress.setText(null);
    197         fieldname.setText(null);
    198         comboBox.setSelectedIndex(0);
    199         read.setSelected(false);
    200         sing.setSelected(false);
    201         dance.setSelected(false);
    202         bg.clearSelection();
    203     }
    204 }
    205 
    206  DemoJFrame
     1  2 
     3 
     4 
     5 import java.awt.EventQueue;
     6 
     7 import javax.swing.JFrame;
     8 
     9 public class Main {
    10     public static void main(String[] args) {
    11         EventQueue.invokeLater(() -> {
    12             DemoJFrame page = new DemoJFrame();
    13         });
    14     }
    15 }
    16 
    17 Main
     1  2 
     3 import java.awt.Dimension;
     4 import java.awt.Toolkit;
     5 import java.awt.Window;
     6 
     7 public class WinCenter {
     8     public static void center(Window win){
     9         Toolkit tkit = Toolkit.getDefaultToolkit();
    10         Dimension sSize = tkit.getScreenSize();
    11         Dimension wSize = win.getSize();
    12         if(wSize.height > sSize.height){
    13             wSize.height = sSize.height;
    14         }
    15         if(wSize.width > sSize.width){
    16             wSize.width = sSize.width;
    17         }
    18         win.setLocation((sSize.width - wSize.width)/ 2, (sSize.height - wSize.height)/ 2);
    19     }
    20 }
    21 
    22  WinCenter

    运行结果如下:、

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

     1 class xian extends Thread { 
     2        public void run()
     3        {
     4            for(int i=1;i<=5;i++)
     5            {  System.out.println( i+ "  (1 : 你好)" );
     6            try{   sleep(200);   }
     7            catch(InterruptedException e)//异常捕获
     8            { System.out.println("Lefthand error.");}    
     9            } 
    10       } 
    11     }
    12 
    13     class xian2 extends Thread {
    14         public void run()
    15         {
    16              for(int i=1;i<=5;i++)
    17              {   System.out.println( i+ " ( 2 : 你好)");
    18              try{   sleep(200);   }
    19              catch(InterruptedException e)//异常捕获
    20              { System.out.println("Lefthand error.");}    
    21              }
    22          }
    23         
    24     }
    25     public class xiancheng 
    26     {
    27         //属性
    28          static xian1 xian11;
    29          static xian2 xian22;
    30          public static void main(String[] args)
    31          {    xian11=new xian1();
    32               xian22=new xian2();
    33               //用start()方法启动线程
    34               xian11.start();
    35                xian22.start();
    36          }
    37     }

    运行结果如下:

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

    4. 实验总结:

      通过这次实验我掌握线程的概念;掌握了线程创建的两种技术;也理解和掌握了线程的优先级属性及调度方法;还 掌握了线程同步的概念及实现技术,继续加油!

  • 相关阅读:
    Windbg DUMP
    NET媒体文件操作组件TagLib
    NET Framework、.NET Core、Xamarin
    面向切面编程
    微服务
    NET Core
    Yeoman generator
    Service Fabric
    Vue.JS 2.x
    CoreCLR
  • 原文地址:https://www.cnblogs.com/yanglinga/p/10115594.html
Copyright © 2020-2023  润新知