第10章多线程讲解.ppt
文本预览下载声明
10.3.1 同步访问共享资源 synchronized关键字也可用于修饰方法,可对该方法所属的对象进行加锁。例10-3中可将数组a封装为类,在类的内部实现转移数据及求和的方法,并用synchronized关键字修饰这些方法。 Java 5.0中提供了ReentrantLock类,既可实现synchronized关键字提供的基本加锁功能,还可提供更灵活的同步控制。该对象提供了lock()和unlock()方法实现加锁和解锁功能。对于内部数据很复杂的类,若每次方法调用都将整个对象锁住,将严重影响程序的并发性。若定义多个ReentrantLock对象,将数据分别上锁,调用不同的方法时获取不同的锁,可有效提高程序的并发性。 10.3.2 协作完成任务 当多个线程需要相互协作完成任务时,可使用条件对象(condition object)进行控制,条件得到满足的线程可以执行,条件未得到满足的线程进入等待状态,当条件改变后,唤醒所有等待该条件的线程,重新对条件进行检测。 调用ReentrantLock对象的newCondition()方法可得到Condition对象,即条件对象。线程运行时若发现条件未满足,可调用条件Condition对象的await()方法进入等待状态。若其他线程改变了条件,可调用Condition对象的signalAll()方法唤醒所有等待此条件的线程。 10.3.2 协作完成任务 【例10-4】 整型数组元素a[0]初值为0,开启3个线程,对a[0]的值进行修改,每次增加[1-50]之间的整数。当0=a[0]100时,由Thread-0负责修改;当100=a[0]200时,由Thread-1负责修改;当200=a[0]300时,由Thread-2负责修改。三个线程相互协作,有序地将a[0]的值修改为一个大于或等于300的整数。 JAVA 程序设计 第10章??多线程 现代操作系统通常都支持多线程。多线程技术是Java平台的一个重要技术优势。基于Java多线程技术可以在应用程序中创建多个可执行代码单元,让CPU同时执行这些代码单元。 本章将详细介绍Java多线程编程的方法和技巧,包括线程的基本概念、线程的创建和生命周期、线程同步等知识。本章内容: 10.1 线程的概念 10.2 线程的实现 10.3 线程同步 10.1 线程的概念 10.1.1 多线程编程的优势 10.1.2 多线程编程的难点 10.1.1 多线程编程的优势 1.充分利用CPU资源 现在主流的CPU都是多核心。如果采用单线程编程,则程序运行时只会使用一个CPU核心。而多线程程序会充分利用所有的CPU核心进行运算,有效提高程序的运行速度。 10.1.1 多线程编程的优势 2.简化异步事件的处理 在进行“服务器-客户端”编程时,若采用单线程来处理,当监听线程接收到一个客户端请求后,开始读取客户端发来的数据,读取结束后,read()方法处于阻塞状态,无法处理其它请求。若使用非阻塞的Socket连接和异步I/O,则难于控制,易出错。若服务器端采用多线程编程,为每个客户端建立一个线程,监听这些线程处相关请求,此种模式最易实现。 10.1.1 多线程编程的优势 3.使GUI更有效率 使用单线程处理GUI事件,必须使用循环对随时可能发生的GUI事件进行扫描,在循环内部除了扫描GUI事件外,还要执行其他的程序代码。若这些代码太长,则GUI事件会被“冻结”,直到这些代码被执行完为止。现代的GUI框架(如SWING、AWT和SWT)中都使用了一个单独的事件分派线程(event dispatch thread,EDT)来对GUI事件进行扫描,可有效降低事件处理的复杂性。 10.1.2 多线程编程的难点 1.访问共享资源 有时多个线程会访问同一资源,若不做任何限制,让多个线程以任意的调度顺序对该资源进行任意的读写操作,则可能出现丢失修改、读脏数据等错误。因此,多线程访问共享资源时,必须通过加锁实现互斥访问。若加锁方式不正确,则可能造成死锁,使程序无法继续运行。 10.1.2 多线程编程的难点 2.线程间协作 有时多个线程必须相互配合才能完成复杂的计算任务。当某个线程运行了一部分代码后,必须等待其它线程的计算结果才能继续运行。线程通过传递消息的方式将自己的状态告知其它线程,收到消息的线程根据实际情况决定是继续等待还是开始运行。若同步方式不正确,可能导致最终的计算结果不正确。 10.1.2 多线程编程的难点 3.调试程序 由于操作系统调度的随机性,每次多线程程序的运行顺序都不一致。若程序有Bug,并不是每次运行都会导致错
显示全部