欢迎访问悦橙教程(wld5.com),关注java教程。悦橙教程  java问答|  每日更新
页面导航 : > > 文章正文

Java,

来源: javaer 分享于  点击 37671 次 点评:181

Java,


 

                                                    多线程编程

         进程:     是指一个在内存中运行的Java程序,每一个进程可以有多个线程:并且都在内存中开辟了一块独立的内存空间。     线程:在进程中执行一个具体的任务(控制单元)     多进程:在windows系统中运行的多个程序(任务管理器)     多线程:在一个进程中运行多个任务          线程类:Thread             一个进程之中的线程启动和执行并不是像程序一样至上而下执行的 是根据CPU的分配和调度资源决定的有一定的随机性! 线程体run() run()是Runnable的接口的方法!线程启动是自动被调用! 启动线程: 调用Thread对象的start方法()
继承Thread 实现Runable接口
①建一个类去继承Thread类
②覆写run()
③自定义对象
④调用start()
继承具有局限性。当我需要同时实现2个及2个以上的接口时,满足不了需求
①建一个类去实现Runnable接口
②覆写run()
③自定义对象
④调用start()
接口很完美的解决了单继承的局限性。
线程的优先级 每一个和程序初始的线程有两个  main() 为主线程:后台线程:垃圾回收线程 主线程的优先级 5 最小线程与最大线程之间的区间为[1,10]   后台线程 每个程序都会默认拥有一个垃圾回收线程,(GC)此线程为后台线程。 ①当前台线程执行完毕后后台线程死亡。 ②不能将活动中的线程该为后台线程。修改时必须在调用start()之前。 setDaemon(boolean);设置线程优先级 getDaemon()获取线程优先级 IsDaemon();返回值类型 boolean 判断是否为后台线程 线程的生命周期: ①新建  new 一个线程是该线程处于新建状态,此时他仅仅和Java对象一样,由Java虚拟机为期分配内存空间。 ②就绪  当线程对象调用start()时,此时该线程处于就绪状态。该线程对象进入排队序列等待CPU调度执行。 ③运行  就绪状态下的线程获得了CPU的资源开始执行run()的线程体此时进入到运行状态                                                                                       ④阻塞  每个单独的线程不可能一直获得CPU的调度资源知道执行完毕,(除非它执行的时间很短,瞬间执行完成)一般来说,在运行一段时间后线程会中断此时有CPU重新调度分配系统资源,此时该线程处于阻塞状态 注意处于阻塞状态的线程不能直接转换为运行状态,只能等待重新进入就绪状态, ⑤死亡  ①run方法执行完毕,②线程抛出异常,③调用stop方法结束线程容易导致死锁。 这三种方式会导致线程死亡。   sleep() 暂停线程: 线程休眠:重载两种方法 sleep(long l) sleep(long l,int i) 第一种。l为线程休眠的时间单位为毫秒: 备注:1秒=1000毫秒 第二种. int 为微妙 休眠的时间为毫秒加微妙   当一个线程调用sleep()是该线程的状态从运行转为阻塞 状态,重新等待CPU的调度后进入就绪状态 join() 个人理解此方法为强制执行机制。某种意义上违背了CPU调度机制的原则。 CPU在分配系统资源不会给某一个线程一直执行直到结束的机会,一般来说,会在执行一段时间后,阻塞该线程重新分配系统资源,而join方法颠覆了这种机制。当某一线程在主线程内调用了join方法,该线程就会一直执行直到结束,此过程中CPU不在会再次调度资源。最后在调用主线程! yield() 此方法为当前线程所调用后,该线程会暂停。CPU会重新调度分配系统资源。  
sleep() yield()
暂停当前线程
状态转为阻塞状态
CPU会给其他线程执行的机会,不会理会优先级。
申明时,会抛出异常InterruptedException必须抛出或处理
暂停当前线程 状态转为就绪状态 会给优先级搞得或者相同优先级的线程执行机会。 申明是没有异常!不需要抛出或处理!
同步代码块 synchronized(同步监听对象) {              可能引发线程安全问题的代码 } 同步监听对象: 是一个任意的对象,多线程来说是同一个对象 同步方法 synchronized 普通方法{                   可能引发线程安全问题的代码 } 同步方法不需要同步监听对象 默认为this 同步锁 private final ReentrantLock lock = new ReentrantLock(); public void mehtod(){              lock.lock();     try{             引发安全性的代码     }catch(){                  }finally{                      lock.unlock();//必须解锁     }   } 线程池: 系统启动一个线程是成本非常高!为了提高系统的性能,于是与线程池来提高性能: 当创建一个线程池时, ①程序中出现了多个生存期很短暂的线程时,如果一律考虑创建,非常消耗系统资源。 ②程序中出现了大量的并发线程时,会使系统性能急剧下降,严重导致JVM虚拟机奔溃。 此时需要一种高效解决的办法来处理上面2中情况! 线程池完美的解决了上述问题。   线程池在系统启动时创建大量的空闲线程,当程序将Runnable对象传给线程池,线程池变回执行Runnable对象的run方法。执行结束后线程不会死亡,返回线程池,成为空闲线程,(重复利用!)   当程序中出现了大量并发程序时,此时通过设定线程池的最大并发线程数来控制,防止JVM奔溃!(安全)         线程通信 wait()   导致当前线程状态为等待。当其他线程调用同步监听器的notify()时被唤醒! notify()唤醒同步监听器上在等待的单个线程 notifyAll()唤醒所以同步监听器上等待的所有线程                                        

相关文章

    暂无相关文章
相关栏目:

用户点评