1、实验目的与要求

(1) 掌握线程概念;

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

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

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

2、实验内容和步骤

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

测试程序1:

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

l 掌握线程概念;

l 掌握用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();}
}

ThreadTest

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

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 ThreadTest
{public static void main(String[] args){   Righthand righthand = new Righthand();//新建一个righthand对象Lefthand lefthand = new Lefthand();//新建一个lefthand对象Thread right = new Thread(righthand);//start方法在Thread类中,新建Thread类
         right.start();Thread left=new Thread(lefthand);left.start();}
}

Runnable接口

测试程序2:

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

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

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

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

package bounce;import java.awt.geom.*;/*** A ball that moves and bounces off the edges of a rectangle* @version 1.33 2007-05-17* @author Cay Horstmann*/
public class Ball
{private static final int XSIZE = 15;private static final int YSIZE = 15;private double x = 0;private double y = 0;private double dx = 1;private double dy = 1;/*** Moves the ball to the next position, reversing direction if it hits one of the edges*/public void move(Rectangle2D bounds){x += dx;y += dy;if (x < bounds.getMinX()){x = bounds.getMinX();dx = -dx;}if (x + XSIZE >= bounds.getMaxX()){x = bounds.getMaxX() - XSIZE;dx = -dx;}if (y < bounds.getMinY()){y = bounds.getMinY();dy = -dy;}if (y + YSIZE >= bounds.getMaxY()){y = bounds.getMaxY() - YSIZE;dy = -dy;}}/*** Gets the shape of the ball at its current position.*/public Ellipse2D getShape(){return new Ellipse2D.Double(x, y, XSIZE, YSIZE);}
}

ball

package bounce;import java.awt.*;
import java.util.*;
import javax.swing.*;/*** The component that draws the balls.* @version 1.34 2012-01-26* @author Cay Horstmann*/
public class BallComponent extends JPanel
{private static final int DEFAULT_WIDTH = 450;private static final int DEFAULT_HEIGHT = 350;private java.util.List<Ball> balls = new ArrayList<>();/*** Add a ball to the component.* @param b the ball to add*/public void add(Ball b){balls.add(b);}public void paintComponent(Graphics g){super.paintComponent(g); // erase backgroundGraphics2D g2 = (Graphics2D) g;for (Ball b : balls){g2.fill(b.getShape());}}public Dimension getPreferredSize() { return new Dimension(DEFAULT_WIDTH, DEFAULT_HEIGHT); }
}

BallComponent

package bounce;import java.awt.*;
import java.awt.event.*;
import javax.swing.*;/*** Shows an animated bouncing ball.* @version 1.34 2015-06-21* @author Cay Horstmann*/
public class Bounce
{public static void main(String[] args){EventQueue.invokeLater(() -> {JFrame frame = new BounceFrame();frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);frame.setVisible(true);});}
}/*** The frame with ball component and buttons.*/
class BounceFrame extends JFrame
{private BallComponent comp;public static final int STEPS = 1000;public static final int DELAY = 3;/*** Constructs the frame with the component for showing the bouncing ball and* Start and Close buttons*/public BounceFrame(){setTitle("Bounce");comp = new BallComponent();add(comp, BorderLayout.CENTER);JPanel buttonPanel = new JPanel();addButton(buttonPanel, "Start", event -> addBall());addButton(buttonPanel, "Close", event -> System.exit(0));add(buttonPanel, BorderLayout.SOUTH);pack();}/*** Adds a button to a container.* @param c the container* @param title the button title* @param listener the action listener for the button*/public void addButton(Container c, String title, ActionListener listener){JButton button = new JButton(title);c.add(button);button.addActionListener(listener);}/*** Adds a bouncing ball to the panel and makes it bounce 1,000 times.*/public void addBall(){try{Ball ball = new Ball();comp.add(ball);for (int i = 1; i <= STEPS; i++){ball.move(comp.getBounds());comp.paint(comp.getGraphics());Thread.sleep(DELAY);}}catch (InterruptedException e){}}
}

Bounce

package bounceThread;import java.awt.*;
import java.awt.event.*;import javax.swing.*;/*** Shows animated bouncing balls.* @version 1.34 2015-06-21* @author Cay Horstmann*/
public class BounceThread
{public static void main(String[] args){EventQueue.invokeLater(() -> {JFrame frame = new BounceFrame();frame.setTitle("BounceThread");frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);frame.setVisible(true);});}
}/*** The frame with panel and buttons.*/
class BounceFrame extends JFrame
{private BallComponent comp;public static final int STEPS = 1000;public static final int DELAY = 5;/*** Constructs the frame with the component for showing the bouncing ball and* Start and Close buttons*/public BounceFrame(){comp = new BallComponent();add(comp, BorderLayout.CENTER);JPanel buttonPanel = new JPanel();addButton(buttonPanel, "Start", event -> addBall());addButton(buttonPanel, "Close", event -> System.exit(0));add(buttonPanel, BorderLayout.SOUTH);pack();}/*** Adds a button to a container.* @param c the container* @param title the button title* @param listener the action listener for the button*/public void addButton(Container c, String title, ActionListener listener){JButton button = new JButton(title);c.add(button);button.addActionListener(listener);}/*** Adds a bouncing ball to the canvas and starts a thread to make it bounce*/public void addBall(){Ball ball = new Ball();comp.add(ball);Runnable r = () -> { try{  for (int i = 1; i <= STEPS; i++){ball.move(comp.getBounds());comp.repaint();Thread.sleep(DELAY);}}catch (InterruptedException e){}};Thread t = new Thread(r);t.start();}
}

BounceThread

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

Race extends Thread

测试程序4

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

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

package unsynch;/*** This program shows data corruption when multiple threads access a data structure.* @version 1.31 2015-06-21* @author Cay Horstmann*/
public class UnsynchBankTest
{public static final int NACCOUNTS = 100;public static final double INITIAL_BALANCE = 1000;//期初余额public static final double MAX_AMOUNT = 1000;//最大数量public static final int DELAY = 10;//延时public static void main(String[] args){Bank bank = new Bank(NACCOUNTS, INITIAL_BALANCE);for (int i = 0; i < NACCOUNTS; i++){int fromAccount = i;Runnable r = () -> {try{while (true){int toAccount = (int) (bank.size() * Math.random());//生成随机数double amount = MAX_AMOUNT * Math.random();bank.transfer(fromAccount, toAccount, amount);Thread.sleep((int) (DELAY * Math.random()));}}catch (InterruptedException e){}            };Thread t = new Thread(r);t.start();}}
}

UnsynchBankTest

package unsynch;import java.util.*;/*** A bank with a number of bank accounts.* @version 1.30 2004-08-01* @author Cay Horstmann*/
public class Bank
{private final double[] accounts;/*** Constructs the bank.* @param n the number of accounts* @param initialBalance the initial balance for each account*/public Bank(int n, double initialBalance){accounts = new double[n];Arrays.fill(accounts, initialBalance);}/*** Transfers money from one account to another.* @param from the account to transfer from* @param to the account to transfer to* @param amount the amount to transfer*/public void transfer(int from, int to, double amount){if (accounts[from] < amount) return;System.out.print(Thread.currentThread());accounts[from] -= amount;System.out.printf(" %10.2f from %d to %d", amount, from, to);accounts[to] += amount;System.out.printf(" Total Balance: %10.2f%n", getTotalBalance());}/*** Gets the sum of all account balances.* @return the total balance*/public double getTotalBalance(){double sum = 0;for (double a : accounts)sum += a;return sum;}/*** Gets the number of accounts in the bank.* @return the number of accounts*/public int size(){return accounts.length;}
}

Bank

综合编程练习

编程练习1

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

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

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

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

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

import java.awt.EventQueue;import javax.swing.JFrame;public class Mian {public static void main(String[] args) {EventQueue.invokeLater(() -> {DemoJFrame page = new DemoJFrame();});}
}

Mian

import java.awt.Color;
import java.awt.Dimension;
import java.awt.FlowLayout;
import java.awt.GridLayout;
import java.awt.LayoutManager;
import java.awt.Panel;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.io.BufferedReader;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.ArrayList;
import java.util.Timer;
import java.util.TimerTask;import javax.swing.BorderFactory;
import javax.swing.ButtonGroup;
import javax.swing.ButtonModel;
import javax.swing.JButton;
import javax.swing.JCheckBox;
import javax.swing.JComboBox;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JRadioButton;
import javax.swing.JTextField;public class DemoJFrame extends JFrame {private JPanel jPanel1;private JPanel jPanel2;private JPanel jPanel3;private JPanel jPanel4;private JTextField fieldname;private JComboBox comboBox;private JTextField fieldadress;private ButtonGroup bg;private JRadioButton nan;private JRadioButton nv;private JCheckBox sing;private JCheckBox dance;private JCheckBox draw;public DemoJFrame() {// 设置窗口大小this.setSize(800, 400);// 设置可见性this.setVisible(true);// 设置标题this.setTitle("Student Detail");// 设置关闭操作this.setDefaultCloseOperation(EXIT_ON_CLOSE);// 设置窗口居中WinCenter.center(this);// 创建四个面板对象jPanel1 = new JPanel();setJPanel1(jPanel1);jPanel2 = new JPanel();setJPanel2(jPanel2);jPanel3 = new JPanel();setJPanel3(jPanel3);jPanel4 = new JPanel();setJPanel4(jPanel4);// 设置容器为流式布局FlowLayout flowLayout = new FlowLayout();this.setLayout(flowLayout);// 将四个面板添加到容器中this.add(jPanel1);this.add(jPanel2);this.add(jPanel3);this.add(jPanel4);}/** 设置面板一*/private void setJPanel1(JPanel jPanel) {jPanel.setPreferredSize(new Dimension(700, 45));//设置此组件的首选大小// 给面板的布局设置为网格布局 一行4列jPanel.setLayout(new GridLayout(1, 4));JLabel name = new JLabel("Name:");name.setSize(100, 50);fieldname = new JTextField("");fieldname.setSize(80, 20);JLabel study = new JLabel("Qualification:");comboBox = new JComboBox();comboBox.addItem("Graduate");comboBox.addItem("senior");comboBox.addItem("Undergraduate");jPanel.add(name);jPanel.add(fieldname);jPanel.add(study);jPanel.add(comboBox);}/** 设置面板二*/private void setJPanel2(JPanel jPanel) {jPanel.setPreferredSize(new Dimension(700, 50));// 给面板的布局设置为网格布局 一行4列jPanel.setLayout(new GridLayout(1, 4));JLabel name = new JLabel("Address:");fieldadress = new JTextField();fieldadress.setPreferredSize(new Dimension(150, 50));JLabel study = new JLabel("Hobby:");JPanel selectBox = new JPanel();selectBox.setBorder(BorderFactory.createTitledBorder(""));selectBox.setLayout(new GridLayout(3, 1));sing = new JCheckBox("Singing");dance = new JCheckBox("Dancing");draw = new JCheckBox("Reading");selectBox.add(sing);selectBox.add(dance);selectBox.add(draw);jPanel.add(name);jPanel.add(fieldadress);jPanel.add(study);jPanel.add(selectBox);}/** 设置面板三*/private void setJPanel3(JPanel jPanel) {jPanel.setPreferredSize(new Dimension(700, 150));FlowLayout flowLayout = new FlowLayout(FlowLayout.LEFT);jPanel.setLayout(flowLayout);JLabel sex = new JLabel("Sex:");JPanel selectBox = new JPanel();selectBox.setBorder(BorderFactory.createTitledBorder(""));selectBox.setLayout(new GridLayout(2, 1));bg = new ButtonGroup();nan = new JRadioButton("Male");nv = new JRadioButton("Female");bg.add(nan);bg.add(nv);selectBox.add(nan);selectBox.add(nv);jPanel.add(sex);jPanel.add(selectBox);}/** 设置面板四*/private void setJPanel4(JPanel jPanel) {// TODO 自动生成的方法存根jPanel.setPreferredSize(new Dimension(700, 150));FlowLayout flowLayout = new FlowLayout(FlowLayout.CENTER, 50, 10);jPanel.setLayout(flowLayout);jPanel.setLayout(flowLayout);JButton sublite = new JButton("Validate");JButton reset = new JButton("Reset");sublite.addActionListener((e) -> valiData());reset.addActionListener((e) -> Reset());jPanel.add(sublite);jPanel.add(reset);}/** 提交数据*/private void valiData() {// 拿到数据String name = fieldname.getText().toString().trim();String xueli = comboBox.getSelectedItem().toString().trim();String address = fieldadress.getText().toString().trim();System.out.println(name);System.out.println(xueli);String hobbystring="";if (sing.isSelected()) {hobbystring+="Singing   ";}if (dance.isSelected()) {hobbystring+="Dancing   ";}if (draw.isSelected()) {hobbystring+="Reading  ";}System.out.println(address);if (nan.isSelected()) {System.out.println("Male");}if (nv.isSelected()) {System.out.println("Female");}System.out.println(hobbystring);}/** 重置*/private void Reset() {fieldadress.setText(null);fieldname.setText(null);comboBox.setSelectedIndex(0);sing.setSelected(false);dance.setSelected(false);draw.setSelected(false);bg.clearSelection();}
}

DemoJFrame

import java.awt.Dimension;
import java.awt.Toolkit;
import java.awt.Window;public class WinCenter {public static void center(Window win){Toolkit tkit = Toolkit.getDefaultToolkit();//获取默认工具包Dimension sSize = tkit.getScreenSize();//获取屏幕的大小Dimension wSize = win.getSize();if(wSize.height > sSize.height){wSize.height = sSize.height;}if(wSize.width > sSize.width){wSize.width = sSize.width;}win.setLocation((sSize.width - wSize.width)/ 2, (sSize.height - wSize.height)/ 2);//将组件移到新的位置
    }
}

WinCenter

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

package shiyan2;public class xiancheng
{static xian1 xian11;static xian2 xian22;        public static void main(String[] args){    xian11=new xian1();xian22=new xian2();               //用start()方法启动线程
       xian11.start();xian22.start();}
}class xian1 extends Thread { public void run(){for(int i=1;i<=5;i++){  System.out.println( i+ "你好"+"     来自线程1");try{   sleep(200);   }catch(InterruptedException e)     //异常{ System.out.println("Lefthand error.");}    } } }class xian2 extends Thread {public void run(){for(int i=1;i<=5;i++){   System.out.println( i+ "你好"+"      来自线程2");try{   sleep(200);   }catch(InterruptedException e)//异常捕获{ System.out.println("Lefthand error.");}    }}}

xiancheng

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

实验总结

  通过本周的学习我了解了线程的概念,并且了解了线程创建的两种技术、线程的优先级属性及调度方法以及终止线程的方法,(1)用Thread类的子类创建线程(2)用Runnable()接口实现线程;理解了线程的优先级属性及调度方法和线程的七种状态。但是这些知识掌握还不牢靠,需要课下多加练习。

转载于:https://www.cnblogs.com/lcjcc/p/10126884.html

201771010109焦旭超《面向对象程序设计(java)》第十六周学习总结相关推荐

  1. 201771010118马昕璐《面向对象程序设计java》第八周学习总结

    第一部分:理论知识学习部分 1.接口 在Java程序设计语言中,接口不是类,而是对类的一组需求描述,由常量和一组抽象方法组成.Java为了克服单继承的缺点,Java使用了接口,一个类可以实现一个或多个 ...

  2. 20177101010101 白玛次仁《面向对象程序设计》第十八周学习总结

    实验十八  总复习 实验时间 2018-12-30 1.实验目的与要求 (1) 综合掌握java基本程序结构: (2) 综合掌握java面向对象程序设计特点: (3) 综合掌握java GUI 程序设 ...

  3. 达拉草201771010105《面向对象程序设计(java)》第十六周学习总结

    达拉草201771010105<面向对象程序设计(java)>第十六周学习总结 第一部分:理论知识 1.程序与进程的概念: (1)程序是一段静态的代码,它是应用程序执行的蓝 本. (2)进 ...

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

    <面向对象程序设计(java)>第十六周学习总结 第一部分:理论知识学习部分 1.程序是一段静态的代码,它是应用程序执行的蓝本.进程是程序的一次动态执行,它对应了从代码加载.执行至执行完毕 ...

  5. 面向对象程序设计——Java语言 第3周编程题 查找里程(10分)

    面向对象程序设计--Java语言 第3周编程题 查找里程(10分) 题目内容 下图为国内主要城市之间的公路里程: 你的程序要读入这样的一张表,然后,根据输入的两个城市的名称,给出这两个城市之间的里程. ...

  6. 201771010126 王燕《面向对象程序设计(Java)》第十六周学习总结

    实验十六  线程技术 实验时间 2017-12-8 1.实验目的与要求 (1) 掌握线程概念: ‐多线程 是进程执行过中产生的多条线索. 是进程执行过中产生的多条线索. 是进程执行过中产生的多条线索. ...

  7. 201771010101 白玛次仁 《2018面向对象程序设计(Java)》第十六周学习总结

    实验十六  线程技术 实验时间 2017-12-8 1.学习总结: 1.程序 是一段静态的代码,它应用程序执行蓝 是一段静态的代码,它应用程序执行蓝 本. 2.进程 是程序的一次动态执行,它对应了从代 ...

  8. 2017面向对象程序设计(Java)第六周学习总结

    转眼间,2017年的法定节日已经休完,我们的java学习也已经进行了六周.下面,我将对上个礼拜的学习情况进行总结. 首先,是学习态度问题.虽然同学们已经从家或者各个旅游景点回来,但是心还是没回来.有同 ...

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

    1.实验目的与要求 (1) 掌握线程概念: (2) 掌握线程创建的两种技术: (3) 理解和掌握线程的优先级属性及调度方法: (4) 掌握线程同步的概念及实现技术: 2.实验内容和步骤 实验1:测试程 ...

最新文章

  1. 好好说一说室内定位技术
  2. python零基础电子书免费下载-零基础学Python
  3. (转)HIBERNATE与 MYBATIS的对比
  4. php php_zip.dll,PHP如何开启自带的ZipArchive类,实现压缩解压功能
  5. android导航屏幕,发现具有软件导航栏的Android设备的真实屏幕尺寸(以像素为单位)...
  6. 7-1 输出全排列 (20 分)(全排列+递归+图解)Come Baby
  7. linux判断改行符_Linux判断符如何使用?
  8. 分析业务模型-类图(Class Diagram)(上)
  9. 2021-06-21属性选择器
  10. mysql数据上传apache_配置Apache服务器 数据库mySQL
  11. Zblog主题,Zblog响应式主题,免费Zblog主题
  12. 打点计时器的实现javascript
  13. ?Agilent.GoldenGate.RFIC.Simulation.2015.01.v4.9.0.Win64 1CD(RTL验证标准)
  14. 怎样用python删除excel中的_Python+Xlwings 删除Excel的行和列
  15. 01-EMC设计规范
  16. 简要比较费雪方程与剑桥方程
  17. 20年的嵌入式经验:如何从零开始开发一款嵌入式产品(值得收藏的高质量文章!)...
  18. linux环境下php安装sqlsrv扩展连接mssql
  19. Multi-Agent Graph Convolutional Reinforcement Learning for Dynamic Electric Vehicle Charging Pricing
  20. Windows 11 安装 WSL

热门文章

  1. python树莓派编程_python树莓派编程
  2. byte转换为string乱码_每日一课 | 如何将int转换为String
  3. 单向队列、双端队列、栈的模型实现
  4. Java常用设计模式————抽象工厂模式
  5. 重定向地址_JavaWeb - Servlet:重定向和转发,状态管理
  6. php的curl如何返回值,怎么在PHP中利用CURL获取返回值
  7. pc个人微型计算机ppt,《IBMPC微型计算机》PPT课件.ppt
  8. 算法竞赛入门经典 第二章总结
  9. wxpython 调用子窗口_wxpython入门第一步(简单例子)
  10. 基于JavaSpringmvc+myabtis+html的鲜花商城系统设计和实现