黑马程序员--线程之间的通信,等待与唤醒机制,线程的终止方式,线程中的其他方法,优先级,toString() 守护线程,GUI图形化界面

  1. ------<a href="http://www.itheima.com" target="blank">Java培训、Android培训、iOS培训、.Net培训</a>、期待与您交流! ------

1.      多线程,状态图(6个状态),创建方式,继承方式,实现接口方式。Thread构造器接收Runnable接口的实现类对象,数据共享。多线程在共享数据的操作上的安全问题,同步技术处理安全问题,synchronized 同步方法,锁是对象,方法默认就是this,静态方法就是类名.class。写单例模式懒汉式,安全和提高效率。死锁,代码背下来

 

2.      第二十五天学习内容:线程之间的通信,等待与唤醒机制,wait notify,多生产与多消费,JDK1.5出现了新的线程控制方式 java.util.concurrent.locks.Lock。线程的终止方式,线程中的其他方法,优先级,toString() 守护线程,加入,让步。GUI图形化界面,AWT和Swing,窗体,布局管理器,事件监听器,适配器使用

 

3.      线程之间的通信

  多线程操作同一共享数据

  一个线程,负责给数据赋值,另一个线程打印数据

  分析数据安全,解决办法,只有同步

  输入,输出都使用同步技术,但是数据安全还是没解决

  先看线程的共享数据,是不是都被同步了

  同步中使用对象锁,是不是同一个,找程序中的唯一对象!!

   实现交替输出打印,需要定义一个标记变量boolean,变量的值是true,没有数据,需要输入线程赋值,如果变量值是false,里面有数据,输入线程必须等。变量值是false,输出线程打印

 

 wait notify 线程无限等待,唤醒等待线程,如果你要使用,必须有锁的支持,写在同步中,必须用锁调用

 

4.      wait方法sleep区别

  wait是Object类的非静态方法,sleep是Thread类的静态方法

  wait必须有锁,sleep任意程序都可以调用,比需要锁

  sleep不会释放锁,wait方法线程释放同步锁,当线程被唤醒的时候,必须从新获取同步锁,才能继续运行

 

5.      为什么线程方法等待,唤醒写了Object类

   wait notify 等待,唤醒本锁上的线程,必须有锁的支持,锁是任意对象,将wait,notify方法写了Object类,保证任意对象锁都可以调用线程,等待唤醒方法

 

6.      多生产与多消费

  多个生成线程,多个消费线程。实现生产一个,消费一个

  需要资源,计数器,标记,生成线程,消费线程

  多线程并发以后,等待后,被唤醒,按照等待的顺序唤醒线程,唤醒另一个方法中的线程呢,唤醒全部线程,Object类方法notifyAll唤醒全部等待的线程,被唤醒后,不会再次判断标记了,直接运行方法。必须让被唤醒后的线程,再次判断标记,如果标记不允许运行,再次进入等待状态。

   以上生产与消费案例,如果使用全部唤醒的话,资源浪费严重。唤醒全部线程是浪费的,唤醒自己本方线程是没有必要的。能不能唤醒对方中的一个呢。在JDK1.4之前无法实现,但是JDK1.5之后,出现了心得方式管理线程,lock锁

 

7.      JDK1.5中,java.util.concurrent.locks包

  提供线程的新的管理方式

  接口Lock,替代了原有的synchronized的使用,使用灵活广泛

  接口中的方法 获取锁lock  释放锁 unlock

   synchronized(this){   lock()

 

    }unlock()

 接口实现类ReentrantLock,

 

接口Condition 替代原有监视器方法 wait notify  notifyAll

新旧方法的对比

   接口中Condition     Object类

       await()            wait()

       signal()            notify()

      signalAll()          notifyAll()

 

获取接口的实现类对象,用Lock接口方法newCondition实现

 

分解成截然不同对象

 

8.      线程停止方式

  线程在运行中,必须让他可以停下,Thread类中有方法stop(),已经过时

  结束线程最终目的,结束run方法就可以

  在循环中,条件写成变量形式,可以修改变量值,让循环结束,循环结束,意味着方法run也就结束了

 

  如果线程处于wait状态,让线程停止呢

  Thread类的方法interrupt()

  有个朋友失眠很严重,我替他找你个超级的催眠大师,很快,就让我这个朋友睡觉了。催眠师说,我催眠的人,除了我以外,谁也叫不醒。催眠师突发心脏病死了。发现其他任何人都不能叫醒我的朋友,找个板砖,打一下,朋友打醒,用力过猛,脑袋流血了,这个朋友出现了异常。

   朋友相当于程序中的线程,催眠师wait方法,板砖interrupt方法,处于等待中的线程会立刻抛出异常

   InterruptedException线程中断异常,处于等待或者休眠中的线程,突然醒来,非正常醒来,抛出这个异常

 

9.      Thread类的toString方法

  打印线程对象,调用线程的toString方法

  Thread[Thread-0,5,main]

  []里面的信息   Thread-0线程的名字  5线程的优先级   main所属组,主线程组

  优先级,Java中的线程,有三种优先级,最高,默认,最低,Thread类中用三个静态常量表示线程的优先级,优先级越高,线程在某一时刻运行的更多些

MAX_PRIORITY =10 NORM_PRIORITY =5    MIN_PRIORITY=1

  setPriority(int newPriority)设置线程的优先级

 

10.  守护线程

  Thread类的方法setDaemon(true)这个线程,标记为守护线程

  必须写在start之前

  圣斗士星矢动画片:星矢,智慧女神雅典娜,雅典娜手下88个圣斗士。圣斗士的存在意义守护雅典娜,雅典娜死了,圣斗士也就没有存在的意义,圣斗士就是雅典娜的守护线程。

  Java中的定时器,java.util.Timer定时器,可以让程序指定时间间隔后,运行

  Timer构造方法,传递参数,false

  Timer类的方法schedule(TimerTask task, Date firstTime, long period)定时器要运行的程序,开始时间,间隔时间

   第一个参数需要运行的程序

   第二个参数是开始时间

   第三个参数间隔的毫秒值

   第一个参数是TimerTask类型,是一个抽象类,子类继承抽象类,重写run方法,传递子类的对象

 

11.  Thread类方法join

  等待该线程终止

  使用了join方法的线程,会一直运行结束,其他线程抢CPU的资源

  t0 join方法 ,结束后,t1 main争夺资源

 

12.  Thread类静态方法yield

  线程的让步,方法要写在线程运行的代码中,写run

  多线程程序,出现线程之间相互谦让,不肯运行的效果

 

13.  图形界面概述

  人机交互:GUI方式,图形界面交互,CMD方式,命令模式

  图形界面的好处:方便,直观,复杂的事情变简单操作

  CMD:记忆命令,使用不方便,不直观

  用户用着越爽,开发者就越痛苦

  Java的图形界面存在于两个包中java.awt  javax.swing

 

14.  awt和swing的区别

  awt 依赖于操作系统,调用操作系统功能实现图形界面,重量级组件

  swing 基于awt基础之上,完全由Java语言自己实现图形界面,不依靠操作系统,属于轻量级组件。

  使用awt制作的界面,界面效果跟随操作系统的变化而变化

  使用swing制作,不跟随系统的变化而变化

15.  awt中的继承体系

  Component是图形界面的顶层类

  分成两个派系

      容器,窗体,容器中可以放容器和组件。Frame窗体,Dailog对话框

      组件,Button按钮  Label标签  checkbox复选框  TextArea文本区域  TextField单行文本

 

16.  Frame窗体

  使用Frame类实现一个窗体

  构造器,空参数,带有一个String参数,窗体的标题

  Frame类的常见方法

l  setVisible(true)窗体设置隐藏或者可见,参数是真,可见,参数是假,不可见

l  setBounds(int 横坐标,int 纵坐标,int 宽度,int高度)设置窗体的大小和位置。横坐标:窗体的最左侧,距离屏幕的位置。单位是像素

l  setBackground(Color c)设置组件的背景色

17.  获取屏幕分辨率

  每个屏幕分辨率不同,必须获取到准确的像素,才能定位
  java.awt.ToolKit,静态方法ToolkitgetDefaultToolKit返回这个类的子类对象

  ToolKit方法 Dimension getScreenSize()获取到屏幕分辨率。

  Dimension类成员变量hight  width 都是int类型,屏幕分辨率

 

18.  布局管理器

  很多的组件,按钮,文本,放置在窗体上,组件如何的排列组合,使用布局管理器对组件进行位置的管理

  很多布局管理器,对组件按照自己的方式来控制,我的按钮,想放哪就放哪,不按照布局方式排列。必须将容器的默认布局管理器取消,调用窗体方法setLayout(null)取消的布局管理器,如果取消了布局管理器,组件必须有定位和尺寸,否则不显示

 

19.  Button组件

  Button类,描述按钮的类,构造方法中,传递一个String标签,传递的标签字符串就会出现在按钮上。将按钮放在窗体上,用窗体的方法add添加

 

20.  事件监听机制

   事件源:凡是用户能操作的组件,都是事件源

   事件:用户的具体操作,鼠标(单,双,右键,轮,拖动,移入,移出),键盘(按下,弹起,按住不放),窗体(打开,关闭,最大,最小化)

   监听器:窃听器。监听用户的操作,只要你有事件的动作,都会被我监听器捕获到,等待用户的事件操作。

   事件处理:监听器捕获到事件发生后,调用方法处理这个事件,处理时间方式就是一个方法的实现。

 

  人的事件监听机制,人等着挨打。

  事件源是人,事件的挨打事件,人在等待挨打,只要有人打我,我就会立刻感觉到,相当于监听器捕获到,根据被打的严重程度,调用不同的处理方式,就是多个方法,如果打的很轻,调用不处理方法,打的很重,调用去医院的方法

 

21.  使用事件监听机制,实现窗体的关闭效果

  事件源是谁: 窗体

  事件:关闭事件

  监听器:需要自己调用方法完成

  处理方法:

  Frame窗体中,有一个方法addWindowsListener 注册一个窗体的事件监听器。方法的参数WindowListener是一个接口。存在与java.awt.event包

  WindowListener接收窗体事件的接口,windowClosing方法,关闭的时候,由事监听器自动调用

 

22.  适配器的设计模式

  手机充电器:电源适配器

  手机电池3.7  电源220 -- 适配 -- 3.7

将接口中的方法,适配成用户想要的方法,接口的空实现

interface A{}

abstract AImp implements A{

  //重写,方法,但是方法中,没有具体代码

}

继承抽象类,想用哪个方法,就重写哪个方法,没有必要重写接口中的全部

图形界面中,写事件监听器的标准格式写法

 事件源.addXXXListener(newXXXAdapter(){

   public void 需要的方法(XXXEvente){

 

    }

})

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值