• 1. 多线程(一)
  • 2. 目标了解多线程的概念 掌握如何创建线程 掌握线程同步 掌握使用 wait() 和 notify() 在线程之间进行通信2018/10/232
  • 3. 多任务处理进程 可以看成是系统资源和程序代码的执行位置的集合。每一个进程都有自己的内存单元,进程之间是互相独立的,一个进程一般不允许访问其他进程的内存空间。 线程 是进程内的一个执行单位。在一个进程内部可以有多个线程,即有多个执行流,这多个多线程共享进程的内存空间和系统资源。它们轮换使用这块内存空间。 应用程序可以使程序同时具有多样性。 2018/10/233
  • 4. 多线程多线程 在Java中,一个应用程序可以包含多个线程。每个线程执行特定的任务,并可与其他线程并发执行 多线程使系统的空转时间最少,提高CPU利用率 多线程编程环境用方便的模型隐藏CPU在任务间切换的事实 2018/10/234
  • 5. 主线程在Java程序启动时,一个线程立刻运行,该线程通常称为程序的主线程。 主线程的重要性体现在两个方面: 它是产生其他子线程的线程。 通常它必须最后完成执行,因为它执行各种关闭动作。2018/10/235
  • 6. 主线程示例class Mythread extends Thread { public static void main(String args[]) { Thread t= Thread.currentThread(); System.out.println("当前线程是: "+t); t.setName("MyJavaThread"); System.out.println("当前线程名是: "+t); try { for(int i=0;i<3;i++) { System.out.println(i); Thread.sleep(1500); } } catch(InterruptedException e) { System.out.println("主线程被中断"); } } }获得当前线程,即主线程改变线程的内部名称输出每个数后暂停1500毫秒
  • 7. 创建线程2-1通过以下两种方法创建 Thread 对象: - 声明一个 Thread 类的子类,并覆盖 run() 方法。 class MyThread extends Thread { public void run( ) {/* 覆盖该方法*/ } } - 声明一个实现 Runnable 接口的类,并实现 run() 方法(注:此种做法只实现的线程任务)。 class MyRunnable implements Runnable{ public void run( ) {/* 实现该方法*/ } }
  • 8. 创建线程2-2要触发一个新线程,使用 start() 方法,如: MyThread t = new MyThread(); t.start(); MyRunnable mr=new MyRunnable (); Thread t=new Thread(mr); t.start(); 在调用 start() 方法时,将创建一个新的控制线程,并加入线程队列,接着它将调用 run() 方法。 run() 方法中的代码定义执行线程所需的功能。 2018/10/238
  • 9. 例子MyTest.java MyDate.java 日期的实现 MyGif.java 动画的实现2018/10/239
  • 10. 多线程(二)杨皓云
  • 11. 线程的状态新建 : 新建的线程处于新建状态 就绪 : 在创建线程后,它将处于就绪状态,等待 start() 方法被调用 运行 : 线程在开始执行时进入运行状态 睡眠 : 线程的执行可通过使用 sleep() 方法来暂时中止。在睡眠后,线程将进入就绪状态2018/10/2311
  • 12. 线程的状态等待 : 如果调用了 wait() 方法,线程将处于等待状态。用于在两个或多个线程并发运行时。 挂起 : 在临时停止或中断线程的执行时,线程就处于挂起状态。 恢复 : 在挂起的线程被恢复执行时,可以说它已被恢复。2018/10/2312
  • 13. 阻塞 – 在线程等待一个事件时(例如输入/输出操作),就称其处于阻塞状态。 死亡 – 在 run() 方法已完成执行或其 stop() 方法被调用之后,线程就处于死亡状态。线程状态2018/10/2313
  • 14. 线程的状态4-4挂起 新线程 就绪运行死亡睡眠等待阻塞
  • 15. 可能使线程暂停执行的条件线程: 线程优先级比较低,因此它不能获得 CPU 时间。 使用 sleep( ) 方法使线程睡眠。 通过调用 wait( ) 方法,使线程等待。 通过调用 yield( ) 方法,线程已显式出让CPU控制权。 线程由于等待一个文件I/O事件被阻塞。2018/10/2315
  • 16. 线程优先级Java 中的线程优先级是在 Thread 类中定义的常量 NORM_PRIORITY : 值为 5 MAX_PRIORITY : 值为 10 MIN_PRIORITY : 值为 1 缺省优先级为 NORM_PRIORITY 有关优先级的方法有两个: final void setPriority(int newp) : 修改线程的当前优先级 final int getPriority() : 返回线程的优先级2018/10/2316
  • 17. 线程优先级线程继承父类的优先级 有关优先级的原则: 优先级高者优先 优先级相同的“先进先出” 切换规则: 自动放弃 高优先权抢占 例子:TestPriority1.java TestPriority2.java2018/10/2317
  • 18. 线程同步有时两个或多个线程可能会试图同时访问一个资源 例如,一个线程可能尝试从一个文件中读取数据,而另一个线程则尝试在同一文件中修改数据 在此情况下,数据可能会变得不一致 为了确保在任何时间点一个共享的资源只被一个线程使用,使用了“同步”2018/10/2318
  • 19. 在Java中获得同步同步基于“监视器”这一概念。“监视器”是用作互斥锁的对象。在给定时刻,只有一个线程可以拥有监视器。 Java中所有的对象都拥有自己的监视器 两种方式实现同步: 使用同步方法 synchronized void methodA() { } 使用同步块 synchronized(object) { //要同步的语句 } 例子:Synch.java2018/10/2319
  • 20. 同步方法class One { synchronized void display(int num) { System.out.print(""+num); try { Thread.sleep(1000); } catch(InterruptedException e) { System.out.println("中断"); } System.out.println(" 完成"); } }class Two implements Runnable { int number; One one; Thread t; public Two(One one_num, int n) { one=one_num; number=n; t=new Thread(this); t.start(); } public void run() { one.display(number); } }
  • 21. 同步块class One { void display(int num) { System.out.print(""+num); try { Thread.sleep(1000); } catch(InterruptedException e){ System.out.println("中断"); } System.out.println(" 完成"); } }class Two implements Runnable { int number; One one; Thread t; public Two(One one_num,int n) { one=one_num; number=n; t=new Thread(this); t.start(); }   public void run() { synchronized(one) { one.display(number); } } }
  • 22. wait-notify-1为避免轮流检测,Java提供了一个精心设计的线程间通信机制,使用wait()、notify()和notifyAll()方法 。 这些方法是作为 Object 类中的 final 方法实现的。 这三个方法仅在 synchronized 方法中才能被调用。2018/10/2322
  • 23. wait-notify-2wait()方法告知被调用的线程退出监视器并进入等待状态,直到其他线程进入相同的监视器并调用 notify( ) 方法。 notify( ) 方法通知同一对象上第一个调用 wait( )线程。 notifyAll() 方法通知调用 wait() 的所有线程,具有最高优先级的线程将先运行。2018/10/2323