day12

一、复习AWT事件模型(Observer模式) 
   1、事件源 
   2、事件对象 
   3、事件监听器 

事件源和监听器事先进行授权注册,当事件条件满足时,事件源会给注册的监听器发送一个事件对象,由事件监听器作出相应的处理。 

一个事件源可以是多种事件的事件源 
一个事件源就同一类事件可以注册多个监听器 
一个监听器可以同时注册在多个事件源当中 

事件源和监听器是独立,弱耦合的,是各司其职的 

事件对象中会封装事件源对象 
事件监听接口中的每一个方法都要以事件对象为参数 
事件源中要保存和它有监听关系的监听器 
事件源给事件监听器发送事件对象:事件源以事件对象作为参数,调用监听器接口的相应方法,通过回调,调用的是不同监听实现类的方法 

二、 
在Java的图形编程中,所有动作(事件)都已经提供了相应的事件对象和事件监听接口, 
例如:实现窗口的关闭按钮,点击关闭按钮会发出相应的事件对象,相应的调用监听器中实现好的方法。 
相应的方法清参阅Java2 SE API帮助文档。 

缺省适配模式,通过一个抽象类实现接口,抽象类中的接口方法实现,都是一个无意义的空实现,可以继承这个抽象类,只覆盖向覆盖的方法就可以了。 

在java.awt.event包中,会有一些适配类,也就是把相应的XXXListener,换成XXXAdapter就是适配类。 
适配类是抽象类,其中对接口XXXListener中的方法进行了空实现,实现这个类,覆盖对自己有用的方法 

在java.awt.event包中的ActionEvent类,在以下操作中会发送这个事件, 
1,JButton组件,按钮被点击 
2,JTextField组件,在单行文本域中按Enter键。 
3,JCheckBox组件,选中了复选框。 
4,JRadioButton组件,选中了单选按钮。 
5,JMenu组件,选中菜单项。 


添加事件监听: 
1、实现监听接口 
2、将监听器对象注册在组件(事件源)中 

ActionEvent  
事件源 --- 组件 JButton 按钮   点击触发ActionEvent  
               JTextField 单行文本域  输入内容以后回车触发ActionEvent  
jtf.getText();  //得到文本域中的内容 

练习: 
1、写一个图形界面,采用BorderLayout布局,中间的部分放置一个可以滚动不可编辑的JTextArea,南面放置一个可以编辑的JTextField, 
但在TextField中输入文字并按下回车的时候,文字会添加到TextArea中 

2、为BAM添加用户界面 
需要以下几个类: 

BAMClient 其中会包含一个Frame,这是用户主界面 
MainPanel:主界面,用户可以选择开户或者登录 
RegisterPanel:用户开户具体用到的界面 
LoginPanel:用户登录需要的界面 
BusinessPanel:界面上会显示账户的功能 至少包括存款和取款,对于可透支的用户,还允许用户修改透支额度,对于贷款用户,还允许用户贷款和还贷款 

注:本练习的界面布局不做要求,请阅读现有代码,添加事件处理代码 
提示:在开户或者登录之后都会跳到BusinessPanel,而用户点击了交易之后,界面停留在BusinessPanel 
要随时注意在BusinessPanel上根据数据的变化更新显示信息 

三、多线程 
C++的多进程是OS系统并发的一个任务 
Java中没有多进程,一个JVM就是一个进程 

线程是在进程中并发的一个顺序的执行流程 

多进程:划分时间片,宏观上并行,微观上串行 
多线程:cpu在进程内部再划分时间片 

CPU ,代码 ,数据 
进程:进程间数据独立 
线程:数据空间共享,堆空间的共享(堆空间中存放的是对象),栈空间是独立的 
所以线程间切换容易,称为轻量级进程 

一个线程对象代表了一个线程,并非就是一个线程 
线程是操作系统中负责维护的资源 
java.lang.Thread类的一个对象就代表一个线程 
线程是底层OS维护的资源,JVM跑在OS上,在JVM中创建一个Thread对象,调用其start()方法,底层OS会申请一个线程资源,线程对象可到底层管理一个线程 
创建好线程之后,把要让线程执行的代码封装到线程对象中(覆盖run()方法) 

实现线程代码的方式: 
1、继承Thread 类,覆盖run()方法 
   去底层申请线程并运行,对线程对象调start()方法,main方法是一个主线程 
   宏观并行,微观串行 
2、实现Runnable接口 
  使用多态获得Runnable对象,成为目标对象 
  再利用目标对象构造线程对象  Thread t = new Thread(target); 


四、多线程的状态转换图(7状态图) 
  见另一文件,名为Thread.pdf 


作业: 
用两种方式实现两个线程,一个线程负责打印1-2600,另一个线程打印A-Z,反复打印100遍 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
package com.ljl.org.test4; /** *@DEMO:Interview *@Author:jilongliang *@Date:2013-4-17 * * 分别使用Runnable接口和Thread类编程实 编写一应用程序创建两个线程一个线程打印输出1—1000之间所有的奇(Odd Number) * 另外一个线程打印输出1-1000之间所有的偶(Even Number)要求两个线程随机休眠一 段时间后 继续打印输出一个 * * 创建线程有两种方式: 1.实现Runnable接口 2.继承Thread类 * 实现方式和继承方式有啥区别? * 实现方式的好处:避免了单继承的局限性 在定义线程时. * 建议使用实现方式 * 区别: * 继承Thread:线程代码存放Thread子类run方法中 实现 * Runnable:线程代码存放接口的子类的run方法 * wait释放资源,释放锁 * sleep释放资源,不释放锁 */ @SuppressWarnings("all") public class Thread1 { public static void main(String[] args) { //方法一 /* OddNumber js = new OddNumber(); js.start(); EvenNumber os = new EvenNumber(); os.start(); while (true) { if (js.i1 == 1000 || os.i2 == 1000) { System.exit(-1); } } */ //方法二 OddNum on=new OddNum(); EvenNum en=new EvenNum(); new Thread(on).start(); new Thread(en).start(); while (true) { if (on.i1 == 1000 || en.i2 == 1000) { System.exit(-1); } } } } /** * ============================继承Thread的线程=============================== */ class EvenNumber extends Thread { int i2; @Override public void run() { for (i2 = 1; i2 <= 1000; i2++) { if (i2 % 2 == 0) { System.out.println("偶數" + i2); } try { sleep((int) (Math.random() * 500) + 500); } catch (Exception e) { } } } } class OddNumber extends Thread { int i1; @Override public void run() { for (i1 = 1; i1 <= 1000; i1++) { if (i1 % 2 != 0) { System.out.println("奇數" + i1); } try { sleep((int) (Math.random() * 500) + 500); } catch (Exception e) { } } } } /** * ============================实现Runnable的线程=============================== */ @SuppressWarnings("all") class OddNum implements Runnable { int i1; @Override public void run() { for (i1 = 1; i1 <= 1000; i1++) { if (i1 % 2 != 0) { System.out.println("奇數" + i1); } try { new Thread().sleep((int) (Math.random() * 500)+500); } catch (Exception e) { } } } } @SuppressWarnings("all") class EvenNum implements Runnable { int i2; @Override public void run() { for (i2 = 1; i2 <= 1000; i2++) { if (i2 % 2 == 0) { System.out.println("偶數" + i2); } try { /**在指定的毫秒内让当前正在执行的线程休眠 * Math.random()一个小于1的随机乘于500+500,随眠时间不会超过1000毫秒 */ //new Thread().sleep((int) (Math.random() * 500)+500); new Thread().sleep(1000);//也可以指定特定的参毫秒 } catch (Exception e) { } } } }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值