java核心课件-第12章
Java程序设计案例教程课件第12章
❖ 结束状态(Terminated)
▪ 线程正常执行完成(从run()方法中返回)或线程被中止。这时释放线程占用的资 源,结束线程的执行。
Java程序设计案例教程
class MyThread extends Thread{ public void run(){ //线程体 }
}
▪ 创建一个该类的实例。
MyThread t = new MyThread();
▪ 启动该实例。
t.start();
Java程序设计案例教程
幻灯片 4,共14页
4
多线程的实现——继承Thread类
for (int i=0;i<3;i++){
System.out.println(threadName+"第"+(i+1)+"次调用");
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
} else { System.out.println("票已经卖完!");
}
}
public void sellTicket() {
synchronized (this) {
if (ticketCount > 0) { System.out.println(Thread.currentThread().getName() + "正在卖第" + (10 - ticketCount + 1) + "张票," + "还剩" + (--ticketCount) + "张票");
java课程总结第12章
最新版整理ppt
9
每个JFrame窗口都有一个内容窗格 (contant pane),窗口中除菜单之外的所有组 件都放在其内容窗格中。
要将组件添加到其内容窗格中,首先用 JFrame类的getContentPane()方法获得其缺省的 内容窗格,getContentPane()方法的返回类型是 java.awt.Container,然后使用add()方法将组件 添加到其内容窗格中。这与在Frame窗口中直接 使用add()方法添加组件明显不同。
Swing中按钮的功能较AWT中的按钮功 能更加强大,包括给按钮添加图像、使用快 捷键以及设置按钮的对齐方式,还可以将多 个图像分配给一个按钮以处理鼠标在按钮上 的停留等。
最新版整理ppt
14
JButton类的构造方法
JButton类的构造方法
功能说明
JButton()
创建一个没有标题和图标的按钮
设置用户关闭窗口时所执行的操作
void update(Graphics g)
调用paint()方法重绘窗口
void remove(Component component)
将窗口中的component组件删除
JMenuBar getMenuBar()
返回窗口中的菜单栏组件
void setLayout(LayoutManager manager) 设置窗口的布局
最新版整理ppt
3
12.1 Swing组件概述
Swing包含了大部分与AWT对应的组 件 。多数Swing组件以字母“J”开头。
Swing组件的用法与AWT组件基本相 同,大多数AWT组件只要在其类名前加J 即可转换成Swing组件 。
最新版整理ppt
javA12章节
11
12
12.3 JLabel • Label
JPanel
Fig. 12.2 Some basic GUI components.
10
Fig. 12.3 Common superclasses of many of the Swing components.
ng.Object ponent java.awt.Container javax.swing.JComponent
Component JLabel JTextField JButton JCheckBox JComboBox JList Description An area where uneditable text or icons can be displayed. An area in which the user inputs data from the keyboard. The area can also display information. An area that triggers an event when clicked. A GUI component that is either selected or not selected. A drop-down list of items from which the user can make a selection by clicking an item in the list or possibly by typing into the box. An area where a list of items is displayed from which the user can make a selection by clicking once on any element in the list. Double list generates an action event. Multiple elements can be selected. A container in which components can be placed.
JAVA第12章
ec=Runtime.getRuntime();
◆ ec可以调用exec(String command)方法打开本地机的可 执行文件或执行一个操作。
例题12-3
8
§12.2 文件字节流 如果程序对文件的操作比较简单,比如只
例题12-5
11
§12.2.3 关闭流
close()方法
◆如果没有关闭那些被打开的流,那么就可能不允许 另一个程序操作这些流所用的资源。 ◆保证操作系统把流缓冲区的内容写到它的目的地。
12
§12.3 文件字符流
1.FileReader和FileWriter用来创建文件字符输入、输出流, 构造方法:
ByteArrayInputStream(byte[] buf); ByteArrayInputStream(byte[] buf,int offset,int length);
public int read();顺序地从源中读出一个字节
public int read(byte[] b,int off,int len);顺序地从源中读出参数len指
是顺序地读写文件,那么就可以使用 FileInputStream 和FileOutputSream 类创建的 流对文件进行读写操作。
9
§12.2.1 文件字节输入流
1.创建文件字节输入流 FileInputStream类创建的对象被称作文件字节输入流。
◆构造方法:
FileInputStream(String name); FileInputStream(File file);
《Java面向对象程序设计》第12章
输入输出流
lesson12-02 Java核心技术课程总结
Java 核心技术第十二章Java案例实践和总结第二节课程总结1概要•总结本课程内容•预告本课程后续的进阶内容本课程内容(1)•Java核心技术本课程内容(2)•Java核心技术–12章,48节–着重Java基础原理:类/对象、继承、多态、异常、包/导入等–了解Java常用类库:数字、字符串、时间等–了解Java基础数据结构:ArrayList、HashSet、HashMap等–初步应用实践:文件处理–两个综合性案例本课程内容(3)•需要熟记的内容–javac.exe, java.exe, main, class, new–abstract, interface, extends, implements, class cast (类转型)–static, final, try-catch-finally–package/import/classpath/jar/private/default/protected/public –Object, Integer, Double, String, SringBuffer, ArrayList, HashSet, HashMap, Arrays/Collections, Comparable, File, BufferedReader, BufferedWriter程序语言的学习路径•如何学习程序语言:抓大放小–HelloWorld 入门–变量类型和变量定义–分支/循环语句、常见运算符–函数–OO特性/其他高级特性–文件处理–其他的模块处理•实战为王,多读、多改、多写下一个课程:Java核心技术(进阶)•全面扩展Java应用–更便捷的开发和构建–单元测试–高级文件处理–多线程和并行处理–网络处理–邮件处理–数据库操作–Java语言和其他语言的互操作性谢谢!8。
第十二章Java2-12事件处理PPT课件
本章讲述的主要内容如下: •基于委托的事件处理模型; •常用的组件事件处理; •鼠标事件和键盘事件处理; •事件处理中的Adapter类和内隐类; •综合举例。
1
12.1 委托事件处理模型
• 事件处理由三个组成部分:事件源、事件
对象 和事件监听者 (封装了关于事件的若干信息)
(某种监听者类的对
局管理器
label=new JLabel(“ ”); //生成没有文本的标签
}
testEventButton obj=new testEventButton( );
contentPane.add(label,BorderLayout.CENTER); // 创建两个按钮对象
button1=new JButton("A");
button1.addActiotentPane;
button2.addActionListener(this);
JButton button1,button2;
JLabel label; // 实现接口中的方法actionPerformed( )
JFrame frame;
field1=new JTextField(10);
Container contentPane;
field2=new JTextField("Enter text here");
JTextField field1,field2,field3;
field3=new JTextField("Uneditable this text",20);
2
12.1 委托事件处理模型(续)
• 程序员的工作:注册监听者和实现事件处 理方法。
java 第八版 中文版课件 第十二章
–catch捕获异常是从上到下匹配的,而且catch只能捕获一次 捕获后处理完就不再调用其他的catch子句,而执行catch后 的代码
–在catch捕获异常时,是允许catch捕获多个异常子类,也允 许捕获父类异常来代替多个捕获子类异常
–允许同时捕获父子类异常。同时捕获父子类异常时,则必 须将子类异常放在父类异常的前面,否则会编译出错.
• 如何进行自定义异常: 写一个类继承异常父类 • 异常类的继承和普通类相同。 • T12ThrowExceptions.java • 展示:
– 自定义异常 – 申明异常 – 抛出异常 – 异常传递/异常链 – 异常捕获与处理
带异常方法的覆盖:总则
• 抛异常方法的覆盖要求子类抛出的异常范围不能比父类抛异 常的范围宽 – 父类抛什么,子类抛什么 – 允许父类抛,子类不抛 – 允许父类抛的多,子类抛的少 – 不允许父类不抛,子类抛 – 不允许子类抛一个父类没有抛的异常
Socket、JDBC连接之类的资源,即使遇到了异常,也 要在finally正确释放占用的资源。
–不要把大量的代码放入单个try块,然后再在catch语句 中声明Exception。而要分离各个可能出现异常的段落并 分别捕获其异常。以方便分析程序抛出异常的原因。
Java的自定义异常
• 自定义异常: 自己定义的异常类,而非java中的异常 类
– finally块中的代码一般都写释放资源的代码,因为无论是 否正常执行,都要释放资源。
• 举例:T12TryCatchFlows.java • 展示:
–try-catch-finally的异常处理顺序(输入不同数目的变元 同类型组合,观测结果)
– Try块中有return时的要求 – 父子异常类catch顺序 • 使用: – java T12TryCatchFlows 非零整数1 非零整数2 – java T12TryCatchFlows 非零整数1 零整数2 – java T12TryCatchFlows 非整数1 非整数2 – java T12TryCatchFlows 非零整数1
JAVA语言程序设计教程第12章Java数据库编程
2021/7/22
5
5
控制台连接到MySQL数据库后,
第12章 Java数据库编程
将显示提示符mysql>。后续我们就可
以在上面执行各种SQL语句,操作
MySQL数据库。下面我们先简单演示
下常用的几个语句。首先是查看已有
数据库的show databases语句。在输入
语句:show databases后,如图12.2所
2021/7/22
40
40
动程序 第12章 Java数据库编程
(2) 通过DriverManager到得一个与
数据库连接的句柄。
Connection conn = null;
conn =
DriverManager.getConnection(dbName,
name, pw);
(3) 通过连接句柄绑定要执行的
数据: 第12章 Java数据库编程
insert into tableName (col1,col2..)
values (‘val1’,‘val2’...);
//向某个表中的特定字段添加相
应的数据
2021/7/22
23
23
第12章 Java数据库编程
• 图12.9 在表中插入数据
2021/7/22
或者是
drop table if exists tbl_name;
此命令把数据表从数据库中永久
2021/7/22
21
21
第12章 Java数据12库.2编.程3 数据的增删改查操作
创建好数据库表之后,就可以通
过增删改查操作,往数据库表里存取
各种数据。
1. 插入数据
2021/7/22
Java语言程序设计讲义-第十二章
第十二章网络通信主要内容:Java语言是如何实现利用URL访问Internet的资源,如何利用网络通信协议TCP和UDP来实现网络通信的。
12.1 URL(Uniform Resource Locator)✓Java语言不仅可以方便地在网络的主页上嵌入Applet,而且还专为网络通信提供了软件包以支持网络编程。
✓URL表示Internet上某一资源的地址。
通过URL,可访问Internet和WWW。
浏览器通过解析给定URL,可在网上查找相应文件和其它资源。
✓URL就是Internet地址()。
URL通过多种协议寻找资源地址以定位Internet上的数据。
✓URL的一般格式为(不考虑特殊情况):protocol://servername:port/path(1)协议即URL的访问方式。
URL可以使用多种访问方式。
常见的协议有:ftp、http、telnet、file、mailto、news。
(2)服务器名可用IP地址或主机名来代替。
IP地址是用来标识主机以及网络中主机位置的一串数字。
(3)端口号作为一种标识,分配给网上计算机间通信的软件程序的。
通常省略,由URL为使用的协议指定一个缺省端口。
(Telnet协议必须指定端口号)✓包中实现了类URLpublic URL(String spec);public URL(URL context,String spec);public URL(String protocol,String host,String file);public URL(String protocol,String host,int port,String file);✓在URL类中封装了获得URL对象各个属性的方法String URL.getProtocol(); // 获得协议名String URL.getHost(); // 获得主机名String URL.getFile(); // 获得文件名String URL.getPort(); // 获得端口名String URL.getRef(); // 获得文件内部的引用例:URL u1=new URL(":80/sa/sp1.html")URL u4=new URL("http","",80,"/sa/s1.html");✓定义URL时,要抛弃例外MalformedURLException✓Java语言中通过URL和URLConnection两种方式访问WWW:(1)通过URL访问WWWURL的方法openStream()与指定的URL建立连接,并返回InputStream类的对象,以从这一连接中读取数据。
Java SE课件:12
MyTimer(){ this.setLayout(null); this.setBounds(200, 200, 300, 100); t=new Label(); t.setBounds(50, 50, 100, 30);
}
}
import java.awt.*; import java.awt.event.*;
类的子类的对象
Public class Test{ public void static main(String[] args){ MyThread mt=new MyThread(); }
} class MyThread extends Thread{
}
线程
2.运行:
一个Thread类的子类需要重写run()方法,而run() 方法中的内容, 就是线程运行时执行的程序。执行线程的start方法,则线程开始运行。
Label t; int k=1200; Timer timer; MyTimer(){
this.setLayout(null); this.setBounds(200, 200, 300, 100);
}
}
import java.awt.*; import java.awt.event.*;
public class MyTimer extends Frame implements ActionListener {
启动线程的程序如下:看看会有什么效果
public class Example { public static void main(String[] args) { Visit v=new Visit(); Thread a=new Thread(v);Thread b=new Thread(v);Thread c=new Thread(v); Thread d=new Thread(v);Thread e=new Thread(v); a.start();b.start();c.start();d.start();e.start(); try {
第12章 (2)教材配套课件
ESP
16
栈顶
……[buffer]
4
4
4
EBP
EBP
RET 地址
large_string 地址 栈底
图12-4 调用function后的堆栈情况
第12章 安全编程
当执行strcpy()函数时,程序将256字节的字符 ‘A’(0x41)拷贝给buffer数组中,然而buffer数组只能容纳 16字节。由于C语言并不进行边界检查,所以结果是buffer 数组后面的240字节的内容也被覆盖掉了,这其中包括EBP、 RET地址、large_string地址。此时RET地址变成了 0x41414141h,所以当函数结束调用返回时,它将返回到 0x41414141h地址处继续执行下一条指令。但由于这个地址 并不在程序实际使用的虚存空间范围内,所以系统就报 “Segmentation Violation”错误。这就是所谓的缓冲区溢出。
第12章 安全编程
这样,攻击者只要把Shellcode代码放在全局、本地或环 境变量中,并使函数指针指向这段程序代码。当用函数指针 调用函数时,执行的将不是函数代码而是攻击代码。
第12章 安全编程
12.1.4 有关Shellcode 一般而言,攻击者利用缓冲区溢出漏洞并不是仅仅想使
程序崩溃,而是想通过这种攻击做更多的事。如通过缓冲区 溢出提升权限,从而获得对系统更多的访问和控制权。这些 目的的实现就是由所谓的Shellcode来完成的。
main:push 1
call proc ...
// 入口参数压栈 // 主函数调用子函数处
proc:push ebp 存器压栈
// 子函数入口处,将基址寄
mov ebp,esp
分配空间
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
12.1 线程和进程
现代操作系统都支持多任务,主要有两种形式:基于线程和基 于进程;
从本质上说,进程就是独立运行的程序,有独立的指令序列, 独立的数据空间和资源;
线程则是依附于进程存在的独立的指令序列,一个进程中可以 有多个线程。这些线程共享进程的数据和资源,线程有独立的 生命周期;
终止状态:由于run方法的正常退出而自然死亡;没有抓取到 的异常事件终止了run方法的执行,从而导致线程突然死亡; 有人调用了该线程的stop方法。
12.3 线程的优先级
对新建的线程通常继承其父类的优先级。用 户可以通过setPriority方法来修改系统自动设 定的线程优先级。
线程优先级的使用原则是与系统有着密切关 系的,当JVM取决于主机平台的线程机制时, 线程的调度完全受线程机制的支配。
}
12.2 线程的状态及其生命周期
I/O结束
阻塞
I/O请求
新建
start()
就绪
分派
yield()
运行
sleep()
notify() notifyAll()
等待
死亡
stopt() run()结束
wait()
休眠
新建态:用new语句创建一个Thread对象时。该状态的线程不 会立即被执行,但会分配系统资源;
} class Test {
public static void main(String args[]) { RunnableThread dog = new RunnableThread ("doggy"); RunnableThread cat = new RunnableThread ("kitty"); Thread t1 = new Thread(dog); Thread t2 = new Thread(cat); t1.start(); t2.start();
单线程实例
class SingleThread { private String id; public SingleThread (String str){ id = str; } public void run(){ for(int i=0; i<4; i++){ for(int j=0; j<100000000; j++); System.out.println(id+" is running.."); } }
由结果可以看出,这两个线程是一起运行的。但哪 一个字符串先出现则不一定,看谁抢到CPU的资源。
12.4.2 实现Runnable接口
class RunnableThread implements Runnable { private String id; public RunnableThread (String str) { id = str; } public void run(){ for(int i=0; i<4; i++){ for(int j=0; j<100000000; j++); System.out.println(id+" is running.."); } }
} }
注意在上页的程序代码中,不能直接调用run方法, 这样只是把run方法运行一遍而已,并没有激活线程。 正确的方式是调用由Thread类继承而来的start方法, 然后由这个方法在计划表(scheduler)中登录这个线 程,最后这个线程开始运行时,run方法自然会被调 用。
不管是继承Thread创建线程,还是实现Runnable接 口创建线程,都应该调用start方法启动线程;
12.4 线程的创建
Thread类:它是线程类的超类,它是一个线 程有生命周期,继承它的类本身也是一个线 程;
Runnable接口:它只定义了线程的行为,由 实现其run方法来实现,但它没有线程的生命 周期,实现它的类本身不是一个线程;
启动线程时,都应调用线程的start方法。
12.4.1 继承Thread类
}
class Test { public static void main(String args[]){ SingleThread dog = new SingleThread ("doggy"); SingleThread cat = new SingleThread ("kitty"); dog.run(); cat.run(); }
就绪态:当线程调用start方法后,CPU会为其分配相应的时间, 这时线程就绪了;
运行态:当线程内的代码块开始执行时,该线程便开始运行。 一旦线程开始运行,它不必始终保持运行状态,因此很多书中 把就绪态和运行态统称为可运行状态;
阻塞/挂起态:有人调用该线程的sleep()方法;该线程调用 了wait方法;该线程试图锁定一个当前被另一个线程锁定了的 对象;有人调用了该线程的suspend方法;
覆盖其run方法,其余方法继承Thread的
class MultThread extends Thread { private String id; public MultThread (String str){ id = str; } public void run(){ for(int i=0; i<4; i++){ for(int j=0; j<100000000; j++); System.out.println(id+" is running.."); } }
} class Test {
public static void main(String args[]){ MultThread dog = new MultThread ("doggy"); MultThread cat = new MultThread ("kitty"); dog.start(); cat.start();
因为没有存储空间的交换,线程间的切换优于进程,因此尽量 用多线程。
Java中线程分为:用户线程和守护线程,特点如下: 用户线程可以转换为守护线程,转换时机只有在新建态和终止 态进行; 守护线程运行于系统后台,一般是为用户线程服务,用户线程 运行于系统前台,当所有的用户线程都终止时,JVM会杀死守 护线程。