Java多线程技术教程
绪 论
is
Java Programming, fall, 2010
public class TwoThreadsTest{ public static void main (String args[]){ SimpleThread thd1, thd2;
绪 论
thd1 = new SimpleThread("rabbit"); // ------3 ------ thd1.start(); // ------4 ------ thd2 = new SimpleThread("tortoise"); thd2.start(); } } class SimpleThread extends Thread{ // ------1 ------ public SimpleThread(String str){ super(str);//调用父类Thread的构造方法。 } public void run(){// ------2 ------ for (int i = 0; i < 10; i++){ System.out.println(i + " " + getName()); try{ sleep((int)(Math.random() * 1000)); 线程体 } catch (InterruptedException e){ } } System.out.println("DONE! " + getName()); } } Java Programming, fall, 2010
第8讲
Java多线程技术
Wen Jiabao, Department of Computer Science & Technology in Hunan University.
Java Programming, fall, 2010
绪 论
1. 2. 3. 问题导入 程序、进程和线程 创建线程的方式 3.1 继承Thread类的方式 3.2 实现Runnable的方式 3.3 两种创建线程方法的比较
Java Programming, fall, 2010
绪 论
1 问题导入
计算需求现状: 随着互联网应用日益普及,数字资源飞速增长,企业 和消费者对计算能力和网络流量需求强劲增长。
计算核心: 作为计算核心的CPU经过30多年的发展,其主频速度已 经接近物理极限。目前,单核处理器正在向多核处理器方向实现跨越式发 展,这为分布式计算、并行处理、集群计算、P2P、分布式数据库等应用 提供了硬件上的支持和准备。 多核处理器确实可以提升计算机的运算速度和性能,但多核处理性能 的发挥依赖于软件,依赖于多线程软件的支持。
Java Programming, fall, 2010
绪 论
2 程序、进程和线程
计算机高级语言一般提供了串行程序设计(即使包含方法调用)的方法。 一个程序启动一个进程。一个进程中只包含一个执行线索,称为主线程。
main() method1() method2()
method3()
Java Programming, fall, 2010
Expressions and Expressions and Flow Control Flow Control
Arrays Arrays
Object-Oriented Programming
Objects Objects and Classes and Classes Advanced Advanced Language Features Language Features
main()方法是Java Application的入口点。执行一个Java应用程序, 首先就会启动一个主线程。由主线程来实现对其它线程的启动、终止、暂 时挂起等。
Java Programming, fall, 2010
绪 论
3 Java创建线程的方式
共享数据
Java虚拟机 (主线程) 代码 虚拟CPU 数据 线程1
Java Programming, fall, 2010
绪 论
2 程序、进程和线程
线程:在一个程序内部实现多个任务(顺序执行线索)的并发执行,其 中每个任务称为线程,即线程是一个程序内部的顺序控制流。线程并不是 程序,它自己本身并不能运行,必须在程序中运行。 多线程技术应用广泛: 腾讯QQ 迅雷等多线程下载软件 浏览器 …… 如果没有多线程技术,只能串行编程的话…
进程、线程的区别: 两者粒度不同,是两个不同层次上的概念。进程是由操作系统来管理 的,而线程则是在一个程序(进程)内。 每个进程是操作系统分配资源和处理器调度的基本单位,拥有独立的 代码、内部数据和状态(进程上下文),而一个进程(程序)内的多线程 只是处理器调度的基本单位,共享该进程的资源,所以线程又被称为轻量 级进程。线程间有可能互相影响。 线程本身的数据通常只有寄存器数据,以及一个程序执行时使用的堆 栈,所以线程的切换比进程切换的负担要小。 有关进程的大部分概念和技术可直接迁移到到线程上。同时并发进程需 要解决的问题,线程也必须给出解决的方案: 线程的同步与互斥问题 线程之间的通信问题
例程:ThreadDemo.java 功能:通过继承Thread实现主线程和另外一个线程的并发执行。 例程:TwoThreadTest.java
功能:本程序通过继承Thread生成两个线程,并发执行。
Java Programming, fall, 2010
public class ThreadDemo{ 2 创建线程的方式 public static void main(String args[]){ new TestThread("ThreadName").start(); while(true){ System.out.println("main thread is running"); } } } class TestThread extends Thread{ public TestThread(String str){ super(str); } public void run(){ while(true){ System.out.println(Thread.currentThread().getName() + " running"); } } }
代码 虚拟CPU 数据 线程2
Java Programming, fall, 2010
绪 论
1. 2. 3. 问题导入 程序、进程和线程 创建线程的方式 3.1 继承Thread类的方式 3.2 实现Runnable的方式
OUTLINE
3.3 两种创建线程方法的比较
3.4 Thread类
3.5 线程的状态控制 4. 5. 线程的同步与互斥 线程通信
Applets
Introduction Introduction to Java Applets to Java Applets
Multithreading
Threads Threads
Communications
Stream I/O Stream I/O and Files and Files Networking Networking
Java Programming, fall, 2010
绪 论
3 Java创建线程的方式
计算机的并发能力(进程并发)由操作系统提供。虽然各种操作系统 (Unix/Linux、Windows等)都支持多线程,但若要用C、C++或其他语 言编写多线程程序是十分困难的,因为它们对数据同步的支持不充分。 Java在语言级提供多线程并发的概念。 什么时候选择线程编程?如果一段代码要执行较长的时间(循环执行) 且计算量不太密集,如监控程序,可选择多线程编程。
Java Programming, fall, 2010
绪 论 3.3 两种创建线程方法的比较
注意事项: run ()方法是运行线程的主体,用start()方法启动线程时自动调用run() 方法。不能自己直接调用run方法。 两种创建线程方法的比较: 使用Runnable接口可以将线程的虚拟CPU、代码和数据分开,形成 一个比较清晰的模型。 使用Runnable接口使得包含线程体的类还可以继承其他类,实现多 继承。 直接继承Thread类以后不能再继承其他类,但编写简单,并可直接操 纵线程;使用Runnable接口时,若要在run()方法中操纵线程,必须使用 Thread.currentThread()方法。
绪 论 3.2 实现Runable接口的方式
通过实现Runable接口的类来实现。 定义一个类实现Runnable接口:implements Runnable
重写其中的run()方法。
创建Runnable接口实现类的对象。 创建Thread类的对象(以Runnable类型对象为构造方法参数)。 用start()方法启动线程。
Exception Handling
Exceptions Exceptions
Developing Graphical User lnterfaces
Building GUIs Building GUIs The AWT The AWT Event Model Event Model The AWT The AWT Component Library Component Library Java Foundation Java Foundation Classes Classes
2.
3. 4.
为什么要引入线程?
线程有哪些应用? 怎么编写Java多线程程序?
Java Programming, fall, 2010
The Java Programming Language Basics