线程和反射机制

线程的优先级:1-10等级(1最低,10最高)
优先级越高的线程被分配时间片段的机会就越多,那么CPU执行的机会就越多


线程安全:
多线程并发访问同一资源,会产生线程安全问题
解决办法:把异步操作变成同步操作
1)多线程并发读写同一临界资源会发生"线程安全并发问题",如果保证多线程
同步访问临界资源,就可以解决安全问题
2)常见的临界资源:
  多线程共享的实例变量
  静态的公共变量
3)异步:执行没有先后顺序       各干各的         Ajax
     同步:执行有先后顺序           你干完我干
4)同步锁:synchronized关键字
synchronized可以修饰方法,当一个方法被修饰后,这个方法就是同步方法,
同一时刻只能有一个线程访问该方法


synchronized块
当一个方法被修饰后,该方法变为同步方法,虽然保证了代码的执行安全,但是
效率低下,我们实际上只需要将方法需要同步的代码片段加锁,这样可以缩小
同步范围,从而提高代码的运行效率
语法:
synchronized(同步监视器){
    需要同步的代码片段
}
同步监视器:就是一个对象,任何对象都可以,但要保证一点,多线程看到应该
是"同一个"对象,通常情况下使用this就可以


非线程安全                              线程安全
StringBuilder     StringBuffer
ArrayList         Vector
HashMap           HashTable
HashSet           ...
对于集合(Collection)和Map而言
Collections类提供了可以将给定的集合转换为线程安全的集合方法


线程池:java1.5提供了并发包concurrent
Executors是工厂,包含工厂用于创建Executor接口的实例


A.创建线程的方式
1.继承Thread类
实现步骤:
1>继承Thread类,覆盖run(),提供并发运行的过程
2>创建这个类的实例,使用start()启动线程


2.实现Runnable接口
实现步骤:
1>实现Runnable接口,实现run()
2>创建这个类的实例,用这个实例作为Thread的构造参数,创建Thread对象
3>使用start()启动线程


3.使用内部类、匿名内部类创建线程


B.线程的状态
1.new        新建状态,还没有启动
2.runnable   可运行状态(线程准备就绪,处于等待状态)
3.running    正在运行,该线程已获取CPU资源
  a.假设线程获取了CPU,则进入running状态,开始执行线程体
  b.假设系统只有一个CPU,那么在任意时间点只有一个线程处于running,
如果是双核,那么同一时间点会有两条线程处于running,但是当线程数大于
处理器数,依然会是多条线程在同一个CPU轮换执行
  c.当一条线程开始运行的时候,如果它不是一瞬间完成,那么它不可能一直
处于running状态,线程在执行过程中会被中断,目的是为了让其他线程获得
执行机会。像这样的线程调度取决于底层平台,对于抢占式策略的平台来说,系统
会给每一个可执行的线程一小段时间来处理任务。当该时间片用完了,系统会剥夺
线程所占资源(CPU),让其他线程获得运行的机会
4.block      阻塞(挂起)状态
  a.以下情况会发生阻塞状态
  1>线程使用了sleep(),主动放弃CPU资源
  2>线程调用了阻塞式IO方法(比如控制台输入方法),在该方法返回前,
该线程被阻塞
  ...
  b.当正在执行的线程被阻塞的时候,其他线程就获得机会,阻塞结束的时候,
该线程将进入runnable等待状态,而非直接进入running状态
5.dead       死亡状态
  run()执行结束,线程进入死亡状态,不要试图对一个已经死亡的线程调用
start(),死亡后将不能再次作为线程执行,会抛出异常


程序、进程、线程三者之间的关系:
程序是由一个或者多个进程组成的,进程又是由一个或者多个线程组成的


线程的状态管理:
1)Thread.sleep(times)
使当前线程从running状态放弃处理器进入block阻塞状态,休眠times毫秒,
再返回runnable等待状态,如果其他线程调用interrupt()打断了当前
线程的block()状态,就会发生InterruptedException中断异常


2)Thread.yield()
主动让出CPU资源,当线程让出处理器,离开running状态,
使它进入runnable等待状态
  
线程的常用属性和方法:
1.线程的优先级        setPriority(等级1-10)
2.后台线程                setDaemon(true)
3.获取线程的名字     getName()
4.获取当前线程         Thread.currentThread()
  
java计时器(定时器)  Timer类
1)可以安排自动计划任务的类,每一个任务都是一个线程
2)创建Timer实例,timer.schedual()可以为Timer实例增加计划
任务,计划任务是一个接口(TimerTask)
3)cancel()清除计时器对象上的所有计划任务


java反射机制
类、方法、属性、构造器都是名词的概念
java中有相应的特殊类:
方法类(Method)  属性类(Field)  构造器类(Constructor)
类类(Class)
发射是java自我管理这些(类、对象)的机制
1.反射的作用
  a.可以通过反射机制发现对象的类型,发现类型的方法、属性、构造器
  b.可以创建对象并访问任意对象方法和属性
2.Class类型加载:
     类加载到内存中:java将磁盘中的类文件加载到内存中
3.Class实例代表java中的类型
  1>获取基本类型的类型
  int.class   long.class   char.class
  2>获取类类型实例(Class)
  String.class   Class.forName("")   "".getClass()
     以上三个方法获取的都是同一个对象,就是String类加载到内存中的结果

你可能感兴趣的:(Java)