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

  • Post author:
  • Post category: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的方法或代码段中调用。



版权声明:本文为qq_38471554原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。