Java语言程序设计(一)- 第三部分

第八章 图形界面设计

(一)、知识点

(1)、设计图形用户界面时一 般有 3 个步骤,分别是选取组件、设计布局及响应事件。
(2)、在 java.awt 包和 javax.swing 包中定义了多种用于创建图形用户界面的组件类。
(3)、不包含本地代码的 Swing 组件被称为“轻量级”组件,而包含 本地代码的 AWT 组件被称为“重量级”组件。
(4)、组件是构成图形用户界面的 基本元素
(5)、组件可以分为容器组件和非容器组件

容器组件:框架(Frame)、面板(Panel)
非容器组件:按钮(JButton)、文本输入框(JTextField)、标签(JLabel)

(6)、容器组件是指可以包含其他组件的组件,又 分为顶层容器一般用途容器
(7)、Swing 中提供了 4 种顶层容器,分别为 JFrame、JApplet、JDialog 和 JWindow
(8)、Java 为所有容器类定义了父类 Container
(9)、JFrame是一个带有标题行和控制按钮(最小化、恢复/最大化、关闭)的独立窗口,有时称为框架
(10)、JWindow 是一个不带有标题行和控制按钮的窗口
(11)、创建小应用程序时使用 JApplet,它被包含在浏览器窗口中
(12)、创建对话框时使用 JDialog
(13)、顶层容器默认内容窗格的布局管理器是 BorderLayout,而 JPanel 默认的布局管理器是FlowLayout,
(14)、JCheckBox 称为复选按钮,而 JRadioButton 称为单选按钮。
(15)、用户在程序界面所进行的操作称为用户事件,对事件的响应称为事件处理
(16)、Java 中,为了便于管理,系统将事件分类,称为事件类型
(17)、为了接收并处理某类用户事件,组件必须注册相应的事件处理程序,这种事件处理程序称为事件侦听程序
(18)、字号是字的大小,单位是磅
(19)、文字字形有字体、样式及字号 3 个要素
(20)、KeyListener接口的作用是 处理键盘事件

(二)、题目

(1)、AWT组件和Swing组件的区别?

AWT组件时早期JDK版本提供的窗口工具集,包含部分本地代码,在不同平台上运行效果有差异,称为重量级 组件
Swing组件是较新JDK版本提供的窗口工具集,功能比AWT更加强大,多数组件名字以“J”开头
Swing组件不含任何本地代码,在任何平台上的显示效果都是一致的,称为 轻量级组件

(2)、JFrame 类

①、构造函数:空,title
·void setVisible(booleanaFlag):设置框架可见或不可见。
·void pack( ):调整框架的大小,以适合其子组件的首选大小和布局。
·void setTitle(String title):设置框架的标题为字符串 title。
·void setLayout(LayoutManager manager):设置布局管理器。
·Container getContentPane( ):返回此框架窗体的内容窗格对象。
·void setSize(intwidth,int height):设置框架的大小,宽度是 width,高度是height。
·void setBackground(Color bg):使用颜色 bg 设置框架的背景色。

(3)、什么是容器组件?容器组件应如何使用?

①、容器组件是指可以包含其他组件的组件
②、容器分为顶层容器和一般用途容器,显示在屏幕上的所有组件都必须包含在某个容器中,有些容器可以嵌套,在这个嵌套层次的最外层,必须是一个顶层容器

(4)、Java有哪些方法可以将组件放到内容窗格中?
内容窗格是Container类,在java.awt中,JPanel是Container的子类

第一种:通过顶层容器的getContentPane()方法获得其默认的内容窗格,然后将组件添加到内容窗格中。
frame.getContentPane().add(button, BorderLayout.CENTER);
第二种:创建新的内容窗格,将组件添加到新的内容窗格,然后用新的内容窗格取代顶层容器默认的内容窗格。
JPanel contentPane = new JPanel();
contentPane.setLayout(new BorderLayout());
contentPane.add(button.BorderLayout.CENTER);
frame.setContentPane(contentPane);

(5)、简介JPanel
普通面板(JPanel)和滚动面板(JScrollPane)

①、面板不能独立存在,必须被添加到其他容器内部
②、面板可以嵌套
③、构造函数: 空,LayoutManager

(6)、简介JScrollPane

①、JScrollPane 是带有滚动条的面板,它是 Container 类的子类。但是只能添加一个组件。所以当有多个组件需要添加时,一般是先将多个组件添加到 JPanel 中,然后再将这个 JPanel 添加到 JScrollPane 中
②、构造函数:空,Component
·void setHorizontalScrollBarPolicy(int policy)
·void setVerticalScrollBarPolicy(int policy)
ScrollPaneConstants.HORIZONTAL_SCROLLBAR_AS_NEEDED(NEVER,ALWAYS)
ScrollPaneConstants.VERTICAL_SCROLLBAR_AS_NEEDED

(7)、AWT中的Scrollbar滚动条组件

构造方法:
·Scrollbar( ):构造一个新的垂直滚动条。
·Scrollbar(int orientation):Scrollbar.HORIZONTAL 或是 Scrollbar.VERTICAL
·Scrollbar(int orientation,int value,int visible, int minimum,int maximum):value 是滚动条的初始值,visible 是 滚动条的可视量

(8)、标签(JLabel)

①、标签(JLabel):显示提示性的文本信息或图标, 不可被编辑
②、构造函数:空, text, icon,horizotalAlignment。
JLabel.LEFT,JLabel.RIGHT 和 JLabel.CENTER 常量,分别表示左对齐、右对齐和居中对齐
③、只有文本信息的标签在水平方向上左对齐,只有图标的标签在水平方向上居中显示,垂直方向居中
④、label.setHorizontal Alignment(JLabel.CENTER);
label.setVerticalAlignment(JLabel.BOTTOM);
setText(String text)
setIcon(Icon icon)

(9)、按钮(JButton)

①、JButton、JToggleButton、JCheckBox 和 JRadioButton,设置文本、设置图标、注册事件侦听程序
②、构造函数:空,text,icon
③、implements ActionListenter,actionPerformed(ActionEvent e)
④、setMnemonic() 键盘助记词
setText()
setToolTipText(String text):设置要显示的提示文本

(10)、JToggleButton

①、选中状态和未选中状态
②、构造函数:空、text、icon、selected 默认未选中
③、ItemListener,itemStateChanged(ItemEvent e),isSelected(),getItem()
④、JToggleButton、JCheckBox 和 JRadioButton不仅可以注册ActionEvent 事件侦听程序,还可以注册 ItemEvent 事件侦听程序

(11)、请说明按钮和按钮组的关系

按钮可以添加到按钮组中,这时首先创建一个按钮组,然后调用按钮组的add()方法将按钮添加进去。
当多个按钮被添加到同一个按钮组后,如果用户选中一个按钮,那么其他按钮就会变为未选中状态,即同一个按钮组中只能有一个按钮处于被选中的状态。

(12)、布局管理器有哪些?

BorderLayout,FlowLayout,GridLayout,CardLayout,BoxLayout

(13)、FlowLayout布局管理器

①、JPanel 默认的布局管理器是FlowLayout
②、构造函数
a: (),居中,间距5像素
b: (int align), FlowLayout.LEFT、 FlowLayout.RIGHT 和 FlowLayout.CENTER 5像素
c:(int align,int hgap,int vgap)

(14)、BorderLayout布局管理器

①、顶层容器中内容窗格的默认布局管理器,java.awt 包
②、容器被划分为5个区域:BorderLayout上部(North)、下部(South)、左部(West)、右部(East)和中部(Center)。容器的每个区域,只能加入一个组件,如果试图向某个区域中加入多个组件,那么只有最后一个组件是有效的。
③、构造函数:( ),(int hgap,int vgap)

(15)、GridLayout 布局管理器

①、网格式,若干行乘若干列,组件依次放入其中,每个组件占据一格。java.awt 包
②、构造函数:
():一行,列数实际需要
(int rows,int cols):rows 和 cols 中的一个值可以为 0(实际需要),但是不能两个都是 0,
(introws,intcols,inthgap,intvgap)

(16)、CardLayout 布局管理器

①、卡片式,java.awt 包
②、卡片的顺序 由组件对象本身在容器内部的顺序决定
③、构造方法:CardLayout( ),CardLayout(inthgap,intvgap)
④、first(Container parent),next,previous,last,show(Container parent,String name)

(17)、BoxLayout 布局管理器

①、javax.swing 包,水平方向排成一行或按垂直方向排成一列
②、BoxLayout(Container target,int axis):BoxLayout.X_AXIS 或BoxLayout.Y_AXIS

(18)、javax.swing中的Box类?

·public static Box createHorizontalBox( ):使用水平方向的 BoxLayout
·public static Box createVerticalBox( ):使用垂直方向的 BoxLayout。
·public static Component createHorizontalGlue( ):填满水平空间
·public static Component createVerticalGlue( ):填满垂直空间
·public static Component createHorizontalStrut(int width):固定水平
·public static Component createVerticalStrut(int height):固定垂直
·public static Component createRigidArea(Dimension d)。指定大小的组件

(19)、空布局?

setLayout(null)
setBounds(int x,int y,int width,int height)

(20)、事件处理

①、用户事件:用户在程序界面所进行的操作
②、事件处理:对事件的响应
③、事件类型: Java中,为了便于管理,系统将事件分类
④、事件侦听程序:在java中就,为了接受和处理某类用户事件,组件必须注册相应的事件处理程序,这种事件处理程序 称为事件侦听程序,也称为侦听器,它是实现了对应侦听程序接口的一个类。
⑤、implements ActionListener, actionPerformed(ActionEvent e),addActionListener, removeActionLinstener()
⑥、委托事件处理模型:事件被直接送往产生这个事件的组件,组件需要注册一个或多个侦听程序。侦听程序的类中包含了事件处理程序,用来接收和处理这个事件。事件时一个对象,它只向注册的侦听程序报告。
⑦、事件处理的步骤:

a.程序中引入java.awt.event包 import java.awt.event;
b.给所需事件源对象注册事件侦听程序。 addXXXListener;
c.实现相应的方法。若某个侦听程序接口包含多个方法,则需要实现所有的方法

(21)、绘图基础

1)、在平面上绘图或显示文字,需要先确定一个 平面坐标系
2)、坐标原点(0,0)位于整个区域的 左上角
3)、RGB一个字节8来保存0~255,颜色在java.awt.Color类中

(22)、字体Font

①、显示文字 drawChars,drawBytes(数组,int offset, int length, int x, int y),drawString(String str, int x,int y)
②、Font f=new Font(“宋体”,Font.PLAIN,14);
③、重用方法:分别获取字体,样式,字号,判断是否是什么类型的样式
④、获取当前机器上所有字体名称
GraphicsEnviroment env = GraphicsEnviroment.getLocalGraphicsEnvironment();
String[] fontNames = env.getAvailableFontFamilyNames();

(23)、Graphics类的基本功能

①、java.awt 包中的 Graphics 类是所有图形处理的基础,Graphics 类是所有图形上下文的抽象父类
②、Graphics类功能:建立字体、设定显示颜色、显示图像和文本、绘制和填充各种几何图形
③、绘图模式主要有两种,分别是正常模式和异或模式。所有绘制都必须通过一个图形对象完成
④、JComponent子类的组件绘图,重写paintComponent()方法,一般组件所属的子类重写paint()方法
⑤、如何在面板中进行绘制图像?

a.由JPanel类派生一个新类
b.重写父类的paintComponent(Graphics g)方法
c.Component.getGraphics()方法得到Graphics对象。

⑥、在javax.swing.JComponent的paint(Graphics g)方法中,会调用如下三个方法
· paintComponent(Graphics g):绘制组件。
· paintBorder(Graphics g):绘制组件的边框。
· paintChildren(Graphics g):绘制组件中的子组件。
⑦、画多边形的方法:drawPolygon( )和 fillPolygon( )

(24)、Polygon类多边形

①、Polygon对象封装了多边形边的坐标
②、构造方法: 空,(int[ ] xpoints,int[ ] ypoints,int npoints)
③、主要方法:
· addPoint(intx,int y):将由参数指定的点加入到多边形中。
· contains(intx,int y):如果指定的点含在多边形中,则返回真。
· contains(Point p):如果指定的点含在多边形中,则返回真。
· getBounds( ):得到多边形的外接矩形。
· translate(intdeltaX,intdeltaY):将多边形的各顶点沿 x 轴偏移 deltaX,沿 y 轴偏移 deltaY。

(25)、Graphics2D绘图

1)、更强大能力:几何形状、坐标转换、颜色管理以及文字布局等更复杂的控制。
2)、图形状态属性:

①、stroke 属性:控制线的宽度、笔形样式、线段连接方式或短划线图案
②、paint 属性:控制填充效果
③、transform 属性: 实现常用的图形平移、缩放和斜切等变换操作
④、clip 属性:用于实现剪裁效果
⑤、composit属性:设置图形重叠区域的效果

(26)、Graphics2D 类的新方法画一个图形的步骤

①、在重画方法paintComponent()或paint()中,把参数g强制转换成GraphicsD对象
②、用图形类提供的静态方法Double()创建该图形的对象
③、以图形对象为参数调用Graphics2D对象的draw()方法绘制这个图形

Graphics2D g2d=(Graphics2D)g;
Line2D line=new Line2D.Double(30.0,30.0,340.0,30.0);//创建图形对象
g2d.draw(line); //绘制线段
RoundRectangle2D rRect=new RoundRectangle2D.Double(13.0,30.0,100.0, 70.0, 40.0,20.0);
g2d.draw(rRect);//绘制圆角矩形

第九章 Swing组件

(一)、知识点

(1)、组合框JComboBox

1)、组合框(JComboBox)是一个下拉式菜单,它有两种形式:不可编辑的和可编辑的
2)、构造方法:JComboBox( ),JComboBox(Object[] items)
3)、默认是不可编辑的,可以通过 setEditable(true)方法将其 设置为可编辑的。
4)、常用方法:

·void addltem(Object anObject):添加。
·void insertItemAt(Object anObject,int index):插入
·void removeAllItems( ):删除所有可选项。
·void removeItem(Object anObject):删除由 anObject 指定的可选项。
·void removeItemAt(int anlndex):删除由 anlndex 指定处的可选项。
·Object getItemAt(int index):返回指定索引序号 index 处的可选项。
·int getItemCount( ):返回列表中的项数。
·int getSelectedIndex( ):返回列表中与给定项匹配的第一个选项的索引序号。
·Object getSelectedItem():返回当前所选项。选项的索引序号是从 0 开始

5)、事件处理:

①、既可以通过ActionListener处理,又可以通过ItemListner处理
②、用户输入项目后按键,对应的接口是ActionListener。
③、用户的一次选择操作会引发两个ItemListener事件,因此通常使用ActionListener比较方便。

(2)、列表JList

1)、列表:可供用户进行选择的一系列可选项
2)、构造函数:空,JList(Object[] listData),JList(Vector listData)
3)、事件处理:implements ListSelectionListener,addListSelectionListener, valueChanged(ListSelectionEvent e)
4)、常用方法:

①int getSelectedIndex( )没有-1
②Object getSelectedValue( )为空是null
③setVisibleRowCount(intvisibleRowCount)不设置滚动条可显示行数

5)、选择模式设置:setSelectionMode(int selectionMode)ListSelectionModel(SINGLE_SELECTION,SINGLE_INTERVAL_SELECTION,MULTIPLE_INTERVAL_SELECTION)

(3)、说明列表的当前选项发生变化的处理过程

①、当用户在列表上选择时,将引发ListSelectionListener事件,在JList中提供了addListSelectionListener(ListSelectionListener listener)方法,该方法用于注册对应事件的侦听程序。
②、在ListSelectionListener接口中,只有一个方法:valueChanged(ListSelectionEvent e)当列表的当前选项发生变化时,将会调用该方法进行响应处理

(4)、文本组件父类JTextComponent

1)、显示信息+提供用户输入
2)、JTextField、JPasswordField、JTextArea的共同父类—JTextComponent
3)、JTextComponent公共方法:

①、提取被选中的文本:String getSelectedText()
②、提取所有文本:String getText()
③、提取指定范围文本:String getText(int offs,int len)
④、选中指定范围文本:void select(int selectionStart,int selectionEnd)
⑤、选中所有文本:void selectAll( )
⑥、设置编辑状态:void setEditable(boolean b)
⑦、设置文本组件内容:void setText(String t)
⑧、设置文本组件的文档:void setDocument(Document doc)
⑨、复制,剪切,粘贴,获取焦点:copy,cut,paste,boolean requestFocusInWindow( )

(5)、文本组件 JTextField

1)、单行文本输入框
2)、构造函数:空,初始字符串String text,列数int columns
3)、JTextField常用方法:

①、添加侦听器:addActionListener(ActionListener l)
②、移除侦听器:removeActionListener(ActionListener l)
③、设置字体:setFont(Font f)
④、设置文本水平对齐方式:setHorizontalAlignment(int alignment)5种JTextField.左中右,LEADING,TRAILING
⑤、获取列数:int getColumns()

(6)、文本区JTextArea

1)、构造函数:空,text,(rows,columns)
JTextArea ta=new JTextArea(“Initial text”,4,30);
2)、常用方法:

①、追加文本:append(String str)
②、指定位置插入文本:insert(String str,int pos)
③、指定位置替换文本:replaceRange(String str,int start,int end)

(7)、简述JTextField和JTextArea的区别
JTextField是单行的输入文本框,用于输入少量文本
JTextArea是个多行多列的文本输入框

(8)、菜单组件

1)、Swing 包中提供了多种菜单组件:JMenuBar、JMenuItem、JMenu、JCheckBoxMenuItem、JRadioButtonMenuItem和JPopupMenu等
2)、菜单栏是窗口中的主菜单;菜单是最基本的下拉菜单
3)、JFrame frame = new JFrame(“ Menu Demo”);
JMenuBar mb = new JMenuBar( );
frame.setJMenuBar(mb);
4)、JMenu构造函数:空,菜单文本,是否可以分离
5)、整个菜单系统看作是一棵树,那么菜单项就是这棵树的叶子
6)、JMenuItem构造函数:
①、():无文本无图标
②、(Icon icon):图标
③、(String text):文本
④、(text,icon):文本+图标
⑤、(text,int mnemonic):文本+快捷键
7)、JMenuItem menultem = new JMenuItem(" Open…" );
menultem.setMnemonic(KeyEvent.VK _0);
menultem.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_1, ActionEvent.ALT_MASK));

(9)、试述JMenuBar,JMenu、JMenuItem的关系
JMenuBar添加定义的是菜单栏,用来包容一组菜单。JMenu可以被添加至JMenuBar。
JMenu还可以添加至另外一个JMenu。如果将JMenu看着是一颗树,那么JMenuItem就是树的叶子,是菜单系统的最下面一级。JMenu可以包容一组JMenuItem。

(10)、分隔线几种方式

①、menul.addSeparator( );
②、menul.add( new JSeparator( ));
③、insertSeparator(int index)

(11)、JCheckBoxMenuItem和JRadioButtonMenuItem

1)、具有选中和不选中状态
2)、两者构造函数:空,文本String text,图标Icon icon, 初始选中状态boolean b
3)、项事件:ItemListener, ItemEvent,itemStateChanged()

(12)、建立一个菜单系统的过程

①、创建菜单栏(JMenuBar)通过setMenuBar()方法放入某个框架中
②、创建若干个菜单JMenu,通过JMenuBar的add方法将菜单加入到菜单栏
③、最后创建各个菜单项JMenuItem,通过JMenu的add方法将他们加入到不同的菜单中

(13)、说明模式对话框和非模式对话框的区别
对话框分为:模式对话框和非模式对话框
模式对话框被关闭之前,其他窗口无法接受任何形式的输入。
非模式对话框可以中断对话过程,去响应对话框之外的事件

(14)、对话框JDialog

1)、对话框:临时可移动窗口,依赖其他窗口。依赖窗口消失或最小化,对话框也消失。窗口还原,对话框会自动恢复。
2)、强制型+非强制型
3)、强制型:对话框被关闭之前,其他窗口无法接受任何形式的输入,也就是该对话过程不能中断,这样的窗口也称之为 模式窗口
4)、构造方法: Dialog owner/ Frame owner, String title, boolean modal组合
5)、刚刚创建的对话框是不可见的,需要调用 setVisible(true)方法才能将其显示出来
6)、对话框也是顶层容器

(15)、标准对话框JOptionPane类

1)、确认对话框:showConfirmDialog
2)、输入对话框:showInputDialog
3)、选项对话框:showOptionDialog
4)、信息对话框:showMessageDialog
Component parent,Object message|,String title,int messageType|,Icon icon

①、Component parentComponent:父窗口对象,为null表示默认frame作为父窗口
②、title:标题
③、Object messge:描述信息,一般是String,也可以是图标,组件,对象数组
④、int messageType:信息类型JOptionPane(ERROR_MESSAGE、INFORMATION_MESSAGE、WARNING_MESSAGE、QUESTION_MESSAGE、PLAIN_MESSAGE)
⑤、int optiontype:按钮类型JOptionPane(DEFAULT_OPTION ,YES_NO_OPTION ,YES_NO_CANCEL_OPTION ,OK_CANCEL_OPTION

(16)、文件对话框JFileChooser类

1)、构造函数:空| File currentDirectory |String currentDirectoryPath
2)、默认不可见,设置可见

①、打开:showOpenDialog(Component parent)
②、保存:showSaveDialog(Component parent)

3)、参数为父组件,为null,显示在屏幕正中
4)、对于文件对话框中的事件,一般都无需进行处理
5)、getSelectedFile( )获取用户选中的文件
int select = fc.showOpenDialog(frame);
if (select == JFileChooser.APPROVE_OPTION) {
File file = fc.getSelectedFile();
tf.setText(file.getName());
}

第十章 、多线程

(一)、知识点

(1)、进程的概念

①、在程序运行时,系统从程序入口开始按语句的顺序完成相应指令直至结尾,再从出口退出,整个程序结束。这样的语句结构称为进程
②、是程序的一次动态执行,对应了从代码加载、执行至执行完毕的整个过程
③、是程序在处理机中的一次运行,不仅包含程序代码,也包括系统资源如CPU、内存空间、I/O端口等

(2)、简述线程的概念

①、线程是进程执行过程中产生的多条执行线索,是比进程单位更小的执行单位。
②、线程在形式上同进程十分相似,都是用一个按序执行的语句序列来完成特定的功能。
③、不同的是,线程没有入口也没有出口,自身不能自动运行,必须栖身某个进程之中,由进程触发执行
④、同一进程的所有线程共享该进程的系统资源,线程之间切换速度比进程切换要快得多

(3)、线程的作用

①、在单CPU的计算机内部,从微观上讲,一个时刻只能有一个作业被执行。实现多线程就是在宏观上使多个作业被同时执行
②、使系统资源特别是CPU的利用率得到提高,整个程序的执行效率也可以提高
③、线程间直接共享数据和资源,多进程之间不能做到这一点
④、多线程的机制可以减轻编写交互频繁、涉及面多的程序的困难

(5)、线程的结构都包含哪些部分,作用分别是什么?
在java中线程由虚拟CPU、执行的代码、处理的数据三个部分组成

1)、虚拟 CPU,封装在 java.lang.Thread 类中,它控制着整个线程的运行.
2)、执行的代码,传递给 Thread 类,由 Thread 类控制按序执行.
3)、处理的数据,传递给 Thread 类,是在代码执行过程中所要处理的数据.

(6)、线程一共有几种状态.?
线程一共有 4 种状态,,分别是新建(New)、可运行状态(Runnable)、死亡(Dead)( 及阻塞(Blocked).

1)、新建:线程对象已创建,没有启动,已有相应的内存空间以及其他资源
2)、可运行:线程已经执行start()方法,进入run()方法中。可能正在运行,可能没有运行,只要CPU一空闲,马上就会运行。
就绪队列:可以运行但没有运行的线程都排在一个队列中,这个队列为就绪队列
3)、阻塞:sleep()和wait()引起阻塞的方法。
阻塞线程不能进入就绪队列排队,必须等到引起阻塞的原因消除,才可以重新进入排队。
4)、中断线程:interrupt()中断正在运行+blocked的线程,后者抛出InterruptedException异常。
方法:

①、void interrupt()去中断
②、static boolean interrupted()检测是否已中断,并重置状态 “interrupted”值,发送两次返回false
③、boolean isInterrupted()检测是否中断,不改状态

5)、死亡: 一是run()执行完毕,二是遇到异常退出

(7)、创建线程的两种方式?

1)、继承Thread类创建线程
启动多个线程后,它们的执行顺序依系统来决定,所以输出的结果 带有部分随机性。
步骤:

①、从Thread类派生出一个子类,在类中一定实现run()
class Lefthand extends Thread { public void run(){…} //线程体 }
②、用该类创建一个对象
Lefthand left=new Lefthand( );
③、用start()方法启动线程left.start( );

2)、实现Runnable接口
Runnable是Java中用以实现线程的接口,从根本上,任何线程功能的类都必须实现该接口。Thread类也实现了Runnable接口
步骤:

①、定义类实现Runnable接口,并实现run()
public class xyz implements Runnable { public void run( ) {…}}
②、Thread类的构造方法来创建线程对象
Runnable r=new xyz( ); Thread t=new Thread (r);

③、用start()方法启动线程t.start();

(8)、创建线程两种方法的适用条件?

1)、采用Runnable接口方法的情况

①被迫采用:因为Java只允许单重继承,如果一个类已经继承了其他类,这就被迫采用实现 Runnable 的方法
②保持风格:原来的线程采用的是实现接口的方法,出于保持程序风格的一贯性而继续使用这种方法。

2)、采用Thread类的情况
代码简洁:当一个run()方法在一个Thread类的子类中时,this实际上引用的是控制运行系统的Thread实例,部分代码比较简洁,所以许多Java程序员愿意使用继承Thread的方法。

(9)、线程的操作方法

·start():启动线程对象,让线程从新建状态转为就绪状态。
·run():用来定义线程对象被调度之后所执行的操作,用户必须重写 run( )方法。
·yield():强制终止线程的执行。 给同优先级线程一个运行的机会
·isAlive():测试当前线程是否在活动。
·sleep(int millsecond):使线程休眠一段时间,时间长短由 millsecond 决定,单位ms。允许低优先级进程运行
·void wait():使线程处于等待状态。让当前线程释放其所是有的 对象互斥锁

(10)、线程的调度

1)、抢占式,而不是时间片式。
2)、java的线程调度采用如下优先级策略
·优先级高的先执行,优先级低的后执行。
·每个线程创建时都会被自动分配一个优先级,默认时,继承其父类的优先级。
·任务紧急的线程,其优先级较高。
·同优先级的线程按“先进先出”的调度原则。
3)、1 5 10,MIN,NORM,MAX

(11)、优先级常用方法
·void setPriority(int newPriority):重置线程优先级。
·int getPriority():获得当前线程的优先级。
·static void yield( ):暂停当前正在执行的线程,即让当前线程放弃执行权。

(12)、ava对阻塞的线程是如何处理的?
在java中,所有被阻塞的线程按次序排列,组成一个阻塞队伍。
所有就绪而没有运行的线程会根据优先级进入一个就绪队列,当CPU空闲时,如果就绪队列不空,队列中第一个最有最高优先级的线程将运行。 当一个线程被抢占而停止运行时,它的运行状态被改变并放到就绪队列的队尾;同样,一个被阻塞的线程就绪后通常也放到一个就绪队列的队尾

(13)、简述sleep()方法和yield方法

①、sleep():Thread.sleep(x),单位为毫秒,可能抛出InterruptedException异常;允许低优先级进程运行
②、yield():给同优先级线程一个运行的机会。如果在就绪队列中有其他同优先级的线程,该方法把调用者放入就绪队列队尾,并允许其他线程运行。如果没有这样的线程,不做任何工作。

(14)、挂起线程

1)、sleep()暂时停止一个线程的执行。线程不是休眠期满后立即被唤醒,因为此时其他线程可能正在执行,重新调度在以下情况下发生:
·被唤醒的线程具有更高的优先级。
·正在执行的线程因为其他原因被阻塞。
·程序处于支持时间片的系统中。
2)、wait()和 notify( )/notifyAll()
wait()当前线程等待,直到其他线程调用此对象的notify( )/notifyAll(),才能唤醒
3)join():引起当前线程等待,直到join()方法所调用的线程结束

(15)、线程的互斥
问题:多个线程不能保证共享数据的一致性
原因:多线程对共享资源访问的不完整性。
解决方案:在java中,引入了“对象互斥锁”的概念,也称监视器,使用它来实现不同线程对共享数据操作的同步。“对象互斥锁”阻止多个线程同时访问同一个条件变量。Java为每个对象的实例配有一个“对象互斥锁”。
同一个时刻只能有一个任务访问的代码区称为临界区

(16)、Java中如何实现“对象互斥锁”?
java中有两种方法实现“对象互斥锁”

①、用关键字volatile来声明一个共享数据(变量)
②、用关键字synchronized来声明操作共享数据的一个方法或一段代码

(17)、线程同步的两种方式比较?

第一种:可以提醒用户同步在发生
第二种:不如上一种妥帖。整个方法视作同步块,会使持有锁定标记的时间比实际需要的时间要长,从而降低效率

(18)、线程同步

1)、理解
2)、若共享对象中只能存放一个数据,可能出现哪些问题.?

①、生产者比消费者快时,消费者会漏掉一些数据没有取到.
②、消费者比生产者快时,消费者取相同的数据.

3)、解决方案
为了解决线程运行速度问题,java在每个对象实例上都有两个线程队列和它相连

  • 第一个:排列等待锁定标志的线程
  • 第二个:实现wait()和notify()的交互机制
  • java.lang.Object 类中定义了三个方法wait()和 notify( )/notifyAll( )
  • wait()作用:当前线程释放“对象互斥锁”,进入wait队列
  • notify( )/notifyAll( )作用:唤醒一个或所有wait队列中的线程,进入等待互斥所的队列。
    *这三个方法只能在被声明为synchronized的方法或代码段中调用。

你可能感兴趣的:(Java,java)