理论知识部分:

1.程序与进程:

程序是一段静态的代码,它是应用程序执行的蓝本。

进程是程序的一次动态执行,它对应了从代码加载、执行至执行完毕的一个完整过程。

2.多线程

多线程是进程执行过程中产生的多条执行线索。

3.进程:

线程是比进程执行更小的单位。线程不能独立存在,必须存在于进程中,同一进程的各线程间共享进程空间的数据。每个线程有它自身的产生、存在和消亡的过程, 是一个动态的概念。线程创建、销毁和切换的负荷远小于进程,又称 为轻量级进程(lightweight process)。

4.Java实现多线程:

-创建Thread类的子类

-在程序中定义实现Runnable接口的类

5.用Thread类的子类创建线程:

首先需从Thread类派生出一个子类,在该子类中 重写run()方法。

class hand extends Thread { public void run() {……} }

然后用创建该子类的对象

Lefthand left=new Lefthand();

Righthand right=new Righthand();

最后用start()方法启动线程

left.start();

right.start();

6.用Runnable()接口实现线程

首先设计一个实现Runnable接口的类;

然后在类中根据需要重写run方法;

再创建该类对象,以此对象为参数建立Thread 类的对象;

调用Thread类对象的start方法启动线程,将 CPU执行权转交到run方法。

7.线程的终止

调用interrupt()方法;

8.

8、测试线程是否被中断的方法

Java提供了几个用于测试线程是否被中断的方法。

-static boolean interrupted()

– 检测当前线程是否已被中断 ,并重置状态 “interrupted”值为false。

-boolean isInterrupted()

– 检测当前线程是否已被中断 ,不改变状态 “interrupted”值 。

9、线程的状态

-利用各线程的状态变换,可以控制各个线程轮流使用CPU,体现多线程的并行性特征。

-线程有如下7种状态:

New (新建)

Runnable (可运行)

Running(运行)

Blocked (被阻塞)

Waiting (等待)

Timed waiting (计时等待)

Terminated (被终止)

10、新创建线程

-new(新建)

线程对象刚刚创建,还没有启动,此时线程还处于不可运行状态。例如: Thread thread=new Thread(r); 此时线程thread处于新建状态,有了相应的内存空间以及其它资源。

11、可运行线程

- runnable(可运行状态)

此时线程已经启动,处于线程的run()方法之中。

此时的线程可能运行,也可能不运行,只要 CPU一空闲,马上就会运行。

调用线程的start()方法可使线程处于“可运行”状态。例如: thread.start();

12、被阻塞线程和等待线程

- blocked (被阻塞)

一个正在执行的线程因特殊原因,被暂停执行, 进入阻塞状态。

阻塞时线程不能进入队列排队,必须等到引起阻塞的原因消除,才可重新进入排队队列。

引起阻塞的原因很多,不同原因要用不同的方法解除。

-sleep(),wait()是两个常用引起线程阻塞的方法。

13、线程阻塞的三种情况

- 等待阻塞 -- 通过调用线程的wait()方法,让线程等待某工作的完成。

- 同步阻塞 -- 线程在获取synchronized同步锁失败(因为锁被其它线程所占用),它会进入同步阻塞状态。

-其他阻塞 -- 通过调用线程的sleep()或join() 或发出了I/O请求时,线程会进入到阻塞状态。当 sleep()状态超时、join()等待线程终止或者超 时、或者I/O处理完毕时,线程重新转入就绪状态。

14、被终止的线程

Terminated (被终止) 线程被终止的原因有二:

一是run()方法中最后一个语句执行完毕而自然死亡。

二是因为一个没有捕获的异常终止了run方法而意外死亡。

可以调用线程的 stop 方 法 杀 死 一 个 线 程(thread.stop();),但是,stop方法已过时, 不要在自己的代码中调用它。

15、多线程调度

-Java 的线程调度采用优先级策略:

优先级高的先执行,优先级低的后执行;

多线程系统会自动为每个线程分配一个优先级,缺省时,继承其父类的优先级;

任务紧急的线程,其优先级较高;

同优先级的线程按“先进先出”的队列原则;

16、Thread类有三个与线程优先级有关的静态量:

MAX_PRIORITY:最大优先权,值为10;

MIN_PRIORITY:最小优先权,值为1;

NORM _PRIORITY:默认优先权,值为5。

实验部分:

测试程序1:

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();}
}

  用runable接口实习

class Lefthand implements Runnable{public void run(){for(int i=0;i<=5;i++){  System.out.println("You are Students!");try{ Thread.sleep(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);  }catch(InterruptedException e){ System.out.println("Righthand error.");}}}
}
public class ThreadTest
{static Thread left;static Thread right;public static void main(String[] args){    Runnable lefthand = new Lefthand();left=new Thread(lefthand);left.start();Runnable righthand = new Righthand();right=new Thread(righthand);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);   }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);  }catch(InterruptedException e){ System.out.println("Righthand error.");}}}
}
public class ThreadTest
{static Lefthand left;static Righthand right;public static void main(String[] args){    Runnable lefthand = new Lefthand();Thread left=new Thread(lefthand);left.start();Runnable righthand = new Righthand();Thread right=new Thread(righthand);right.start();}
}

  

测试程序2:

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);});}
}

  

package bounceThread;import java.awt.*;
import java.util.*;
import javax.swing.*;/*** 画球的部件。* @version 1.34 2012-01-26* @author Cay Horstmann*/
public class BallComponent extends JComponent
{private static final int DEFAULT_WIDTH = 450;private static final int DEFAULT_HEIGHT = 350;private java.util.List<Ball> balls = new ArrayList<>();/*** 向面板中添加一个球。* @param b把球加到面板上*/public void add(Ball b){balls.add(b);}public void paintComponent(Graphics g){Graphics2D g2 = (Graphics2D) g;for (Ball b : balls){g2.fill(b.getShape());}}public Dimension getPreferredSize() { return new Dimension(DEFAULT_WIDTH, DEFAULT_HEIGHT); }
}

  

package bounceThread;import java.awt.geom.*;/**从长方形边缘上移动和弹跳的球* @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;/**将球移动到下一个位置,如果球碰到其中一条边,则反向移动*/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; }}/**获取球在当前位置的形状。*/public Ellipse2D getShape(){return new Ellipse2D.Double(x, y, XSIZE, YSIZE);}
}

  

 

package bounceThread;import java.awt.*;
import java.awt.event.*;import javax.swing.*;/*** 显示动画弹跳球。* @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);});}
}/*** 带有面板和按钮的框架。*/
class BounceFrame extends JFrame
{private BallComponent comp;public static final int STEPS = 1000;public static final int DELAY = 5;/*** 使用组件构造框架,以显示弹跳球和开始和关闭按钮*/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();}/*** 将按钮添加到容器中。* @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);}/*** 在画布上添加一个弹跳球,并启动一根线使其弹跳*/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();}
}

 

测试程序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

package unsynch;import java.util.*;/*** 有许多银行账户的银行。* @version 1.30 2004-08-01* @author Cay Horstmann*/
public class Bank
{private final double[] accounts;/***构建了银行。* @param n账户数量* @param 每个帐户的初始余额*/public Bank(int n, double initialBalance){accounts = new double[n];Arrays.fill(accounts, initialBalance);}/*** 把钱从一个账户转到另一个账户。* @param 从账户转出* @param 到账转到* @param 转帐金额*/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());}/*** 获取所有帐户余额的总和。* @return 总平衡*/public double getTotalBalance(){double sum = 0;for (double a : accounts)sum += a;return sum;}/*** 获取银行中的帐户编号。* @return 账户数量*/public int size(){return accounts.length;}
}

  

package unsynch;/*** 当多个线程访问一个数据结构时,这个程序显示数据损坏。* @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();}}
}

  

综合编程练习

1 .

package 第十六周;import javax.swing.*;
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;public class Aaa extends JFrame {private JTextField name;private JTextField psw;public Aaa() {JPanel panel = new JPanel();getContentPane().add(panel, BorderLayout.CENTER);panel.setLayout(new GridLayout(3, 2, 5, 2));JPanel panel_1 = new JPanel();panel.add(panel_1);JLabel label = new JLabel("Name:");panel_1.add(label);name = new JTextField();panel_1.add(name);name.setColumns(10);JPanel panel_4 = new JPanel();panel.add(panel_4);JLabel Label4 = new JLabel("Qualification:");panel_4.add(Label4);String[] nians = { "Graduate", "Academic degree", "Foundation degree", "Ungraduate" };final JComboBox comboBox = new JComboBox(nians);panel_4.add(comboBox);JPanel panel_2 = new JPanel();panel.add(panel_2);JLabel label2 = new JLabel("Address:");panel_2.add(label2);psw = new JTextField();panel_2.add(psw);psw.setColumns(10);JPanel panel_5 = new JPanel();panel.add(panel_5);JLabel Label5 = new JLabel("Hobby:");panel_5.setLayout(new GridLayout(3, 2, 0, 0));panel_5.add(Label5);final JCheckBox cb1 = new JCheckBox("Reading");panel_5.add(cb1);JLabel reginfo1 = new JLabel(" ");panel_5.add(reginfo1);final JCheckBox cb2 = new JCheckBox("Singing");panel_5.add(cb2);JLabel reginfo2 = new JLabel(" ");panel_5.add(reginfo2);final JCheckBox cb3 = new JCheckBox("Dancing");panel_5.add(cb3);JPanel panel_3 = new JPanel();panel.add(panel_3);panel_3.setLayout(new GridLayout(2, 2, 0, 0));JLabel Label3 = new JLabel("Sex:");panel_3.add(Label3);final JRadioButton rb1 = new JRadioButton("Female");panel_3.add(rb1);JLabel reginfo3 = new JLabel(" ");panel_3.add(reginfo3);JRadioButton rb2 = new JRadioButton("Male");panel_3.add(rb2);ButtonGroup bg = new ButtonGroup();bg.add(rb1);rb1.setSelected(true);bg.add(rb2);JPanel panel1 = new JPanel();getContentPane().add(panel1, BorderLayout.SOUTH);panel1.setLayout(new GridLayout(2, 1, 5, 2));JPanel panel_6 = new JPanel();panel1.add(panel_6);JButton jbreg = new JButton("Validate");panel_6.add(jbreg);JButton jbrest = new JButton("Reset");panel_6.add(jbrest);JPanel panel_7 = new JPanel();//getContentPane().add(panel_7, BorderLayout.SOUTH);JLabel reginfo4 = new JLabel(" ");panel_7.add(reginfo4);setSize(480,400);setLocationRelativeTo(null);setDefaultCloseOperation(EXIT_ON_CLOSE);setTitle("信息采集");jbreg.addActionListener(new ActionListener() {@Overridepublic void actionPerformed(ActionEvent e) {StringBuilder sb = new StringBuilder();String id = name.getText();sb.append("Name:" + id);if (name != null) {System.out.println("Name:"+id);}String pas = psw.getText();sb.append("Address:" + pas);if (pas != null) {System.out.println("Adress:"+pas);}System.out.println("Sex:");if (rb1.isSelected()) {sb.append("Sex:" + "Female");System.out.println(rb1.getText());} else {sb.append("Sex:" + "Male");System.out.println(rb2.getText());}sb.append("Qualification:" + comboBox.getSelectedItem().toString());sb.append("Hobby:");System.out.println("Hobby:");if (cb1.isSelected()) {sb.append(cb1.getText());System.out.println(cb1.getText());}if (cb2.isSelected()) {sb.append(cb2.getText());System.out.println(cb2.getText());}if (cb3.isSelected()) {sb.append(cb3.getText());System.out.println(cb3.getText());}reginfo4.setText(sb.toString());}});jbrest.addActionListener(new ActionListener() {@Overridepublic void actionPerformed(ActionEvent e) {name.setText("");psw.setText("");rb1.setSelected(true);comboBox.setSelectedIndex(0);cb1.setSelected(false);cb2.setSelected(false);cb3.setSelected(false);reginfo4.setText(" ");}});}public static void main(String[] args) {new Aaa().setVisible(true);}
}

 

 

点击重置:

2.

package 第十六周;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 extends Thread {public void run() {for (int i = 1; i <= 5; i++) {System.out.println(i+":lefthand.你好!");try {sleep(300);} catch (InterruptedException e) {System.out.println("Lefthand error.");}}}
}class Righthand extends Thread {public void run() {for (int i = 1; i <= 5; i++) {System.out.println(i+":righthand.你好!");try {sleep(300);} catch (InterruptedException e) {System.out.println("Righthand error.");}}}
}

  

实验总结:

本周我们学习了线程,我明白了在java中,线程的重要性。但是有些问题我还是不太理解,比如如何判断线程终止,其次,在编程练习1中我的布局还是存在一些问题,我会再去继续改正。

转载于:https://www.cnblogs.com/Weiron/p/10126480.html

201771010110孔维滢《面向对象程序设计Java》第十六周实验总结相关推荐

  1. 201771010110孔维滢面向对象程序设计(Java)第7周学习指导及要求

    学习目标 深入理解OO程序设计的特征:继承.多态: 熟练掌握Java语言中基于类.继承技术构造程序的语法知识: 利用继承定义类设计程序,能够设计开发含有1个主类.2个以上用户自定义类的应用程序. 实验 ...

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

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

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

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

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

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

  5. 孔维滢 20171010110《面向对象程序设计(java)》第十周学习总结

    理论知识: 1.泛型类的定义,一个泛型类就是具有一个或多 个类型变量的类,即创建用类型作为参数的类. 如: class Generics<K,V>: 2.泛型方法,除了泛型类外,还可以只单 ...

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

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

  7. 【Java】《面向对象程序设计——Java语言》Castle代码修改整理

    前言 最近闲来无事刷刷MOOC,找到以前看的浙大翁凯老师的<面向对象程序设计--Java语言>课程,重新过一遍仍觉受益颇深. 其中有一个Castle的例子,思路很Nice但代码很烂,翁凯老 ...

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

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

  9. 计算机JAVA相关说课稿_面向对象程序设计-java说课稿

    面向对象程序设计-java说课稿 面向对象程序设计-JAVA说课稿,计算机系 毕景霞,目录,一.说教材 二.说教学目标 三.说重点难点 四.说教学方法 五.说教学内容 六.教学效果及总结,(一)教材的 ...

最新文章

  1. 【SQLServer】【恢复挂起的解决方案】附加文件时候的提示“无法重新生成日志,原因是数据库关闭时存在打开的事务/用户,该数据库没有检查点或者该数据库是只读的。 ”【数据库恢复】...
  2. delphi 数字识别_基于STM32单片机的车牌识别
  3. Angular CLI版本问题(Your global Angular CLI version (12.2.7) is greater than your local version (9.0.3))
  4. linux 虚拟机大量udp请求失败_理解 Linux 网络栈:Linux 网络协议栈简单总结分析...
  5. 【PTA天梯赛CCCC -2017决赛L2-3】图着色问题 (25 分)(图染色)
  6. JS----贪吃蛇游戏
  7. 帕特·基辛格被任命为英特尔CEO已有一年
  8. The Real Time Linux and RT Applications | PREEMPT_RT
  9. 页面css样式找不到问题
  10. html点击发送qq邮箱_qq邮箱怎么发送文件夹
  11. PHP的XML Parser(转)
  12. 【Gym-102059 G】Fascination Street【亏欠型DP思想】
  13. python dict排序
  14. matlab 同态滤波
  15. 有关Idea的Invalidate Caches/Restart
  16. 山东省首版次高端软件产品申报
  17. 《自控力》读书笔记及实践
  18. python相关性系数_聊聊你知道和不知道的相关性系数
  19. 房屋租赁管理系统的设计和实现,SpringBoot计算机毕业设计论文
  20. R语言命令行写linux,如何在Linux上编写和使用R脚本

热门文章

  1. MMsegmentation教程 4: 自定义模型
  2. Mysql主从复制—判断是否延迟
  3. c++将字符数组转成字符串
  4. 根据模板导出word,复合格式表格生成、可变列表格生成
  5. [勇者闯LeetCode] 169. Majority Element
  6. 深度学习2.1二分类(Binary Classification)
  7. 2021年导游资格报考条件
  8. idea项目修改名字
  9. ethernet phy 的 strap pin 电阻值的确定
  10. 用正则表达式爬取古诗文网站,边玩边学