Java程序设计 第十三章多线程-讲义
合集下载
相关主题
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
多 线 程 编 程 基 础
9
2.1 利用Thread类创建线程
——例11_1
在新线程中完成计算某个整数的阶乘; 步骤:
继承;
在继承的类中覆盖 在那个类中覆盖?
覆盖run方法;
调用start方法。
在那个类中调用? 在主类中调用
Exa11_1.java
Run
10
11
——例11_1运行结果及分析
17
小试牛刀——编写自己的线程!
1. 创建3个新线程,每个线程睡眠一段随机时间(0~6秒),然 后结束(Thread_sleep.java) 2. 创建创建并运行三个线程(TestThread.java) 第一个用于打印100次字母a; 第二个用于打印100次字母b; 第三个用于打印整数1到100;
Thread类直接继承了Object类,并实现了Runnable接口。封装 了Java程序中一个线程对象需要拥有的属性和方法; 从Thread类派生一个子类,并创建这个子类的对象,就可以产 生一个新的线程。这个子类应该重写Thread类的run方法,在 run方法中写入需要在新线程中执行的语句段。这个子类的对 象需要调用start方法来启动,新线程将自动进入run方法。原 线程将同时继续往下执行 它位于java.lang包中,因而程序开头不用import任何包就可直 接使用
public Thread(String name) public static Thread currentThread()
public static void yield() public static void sleep(long millis)
构造一个新的线程对象,并同时指定线程名
返回当前正在运行的线程对象 使当前线程对象暂停,允许别的线程开始运行 使当前线程暂停运行指定毫秒数,但此线程并不失 去已获得的锁旗标。
}
public static void main( String [] args ) {
System.out.println("main thread starts");
FactorialThread t=new FactorialThread(10); new Thread(t).start();
15
——常用API函数
启动线程,JVM将调用此线程的run方法, 结果是将同时运行两个线程,当前线程和 执行run方法的线程
Thread的子类应该重写此方法,内容应为 该线程应执行的任务。 停止线程运行,释放该线程占用的对象锁 旗标。 打断此线程
public void start() public void run() public final void stop() public void interrupt()
public final void checkAccess()
判断当前线程是否有权力修改调用此方法的线 程
public void setName(String name) 更该本线程的名称为指定参数
public final boolean isAlive()
测试线程是否处于活动状态,如果线程被启动 并且没有死亡则返回true
Run
13
——例11_1修改后运行结果
修改后运行结果
main thread starts
new thread stared The factorial of 10 is 3628800 new thread ends main thread ends
运行结果说明
新线程很快结束,而main线程延迟1毫秒后才结束
public final void join()
public final void join(long millis)
在当前线程中加入调用join方法的线程A, 直到线程A死亡才能继续执行当前线程
在当前线程中加入调用join方法的线程A, 直到到达参数指定毫秒数或线程A死亡才能 继续执行当前线程
16
26
创建并使用他们
public class Exa11_2{ public static void main( String [] args ) { TestThread thread1 = new TestThread(); TestThread thread2 = new TestThread(); TestThread thread3 = new TestThread(); System.out.println( "Starting threads" ); new Thread(thread1,"Thread1").start(); new Thread(thread2,"Thread2").start(); new Thread(thread3,"Thread3").start(); } System.out.println( "Threads started, main ends\n" );
System.out.println("new thread started,main thread
ends " ); }
25
第一步:实现接口
class FactorialThread implements Runnable { private int num; public FactorialThread( int num ) { this.num=num; } public void run() { int i=num; int result=1; while(i>0) { result=result*i; i=i-1; } System.out.println("The factorial of "+num+" is "+result); System.out.println("new thread ends"); } }
结果说明
12
更上一层楼——对例11_1进行修改
源程序修改
如果启动新线程后希望主线程多持续一会再结束,可在 start语句后加上让当前线程(这里当然是main)休息1毫
秒的语句:
try { Thread.sleep(1); } catch(Exception e){};
Exa11_1a.java
一个进程表面上看同时可以执行一个以上的任务——并发执行 线程是轻量级进程,它和进程一样拥有独立的执行控制,由操作系统负 责调度,区别在于线程没有独立的存储空间,而是和所属进程中的其它 线程共享一个存储空间,这使得线程间的通信远较进程简单。
进程和线程的区别
6
Java中的线程处理和编程方法
处理方法:
Java语言程序设计
第11章 多线程编程基础
目录
多线程编程基础
线程的生命周期
线程的优先级 本章小结
2
1 多线程编程基础
本节主要内容及任务
为何使用线程? 如何编写线程? 如何实现多线程?
线程的概念
继承和扩展
线程的资源共享 线程的同步控制
3
线程的概念
程序 进程 线程 多进程VS多线程
运行结果
main thread is started …. main thread is ended new thread started The factorial of 10 is 3628800 new thread ends
main线程已经执行完后,新线程才执行完 main函数调用thread.start()方法启动新线程后并不等待其run方 法返回就继续运行,thread.run函数在一边独自运行,不影响原 来的main函数的运行
}
27
线程的资源共享问题
4 线程间的资源共享
代码共享
多个线程的执行代码来自同一个类的run方法时,即称 它们共享相同的代码 当多个线程访问相同的对象时,即它们共享相同的数据 使用Runnable接口可以轻松实现多个线程共享相同数 据,只要用同一个实现了Runnable接口的实例作为参 数创建多个线程就可以了
——常用API函数
public final void setPriority( int newPriority)
设置线程优先级
设置是否为后台线程,如果当前运行线程均为 后台线程则JVM停止运行。这个方法必须在 start()方法前使用
public final void setDaemon(Boolean on)
……………
3.Runnable接口
Runnable接口
多 线 程 编 程 基 础
Java多线程机制的一个重要部分,实际上它只有一个run()方法
Thread类实现了Runnable接口,相对于Thread类,它更适合于多
个线程处理同一资源
实现Runnable接口的类的对象可以用来创建线程,这时start方
线程的概念
硬盘 内存
程序
进程
线程
线程
5
线程的概念
多进程VS多线程
进程
一个独立程序的每一次运行称为一个进程; 一个程序中多段代码同时并发执行,称为多线程 Java是第一个支持内置线程操作的主流编程语言
多 线 程 编 程 基 础
线程
多数程序设计语言支持多线程要借助于操作系统“原语(primitives)”
14
Thread的常用API函数
名称
public Thread()
说明
构造一个新的线程对象,默认名为Thread-n,n是 从0开始递增的整数
构造一个新的线程对象,以一个实现Runnable接口 的类的对象为参数。默认名为Thread-n,n是从0开 始递增的整数
public Thread(Runnable target)
Thread_Sleep TestThread
Run Run
18
19
20
第一个程序运行结果及分析
运行结果
Starting threads Threads started, main ends
thread1 going to sleep for 3519 thread2 going to sleep for 1689 thread3 going to sleep for 5565 thread2 finished thread1 finished thread3 finished
说明
由于线程3休眠时间最长,所以最后结束,线程2休眠时 间最短,所以最先结束 每次运行,都会产生不同的随机休眠时间,所以结果都 不相同
21
第二个程序运行结果说明
在单个CPU上:
由于共享,在控制台上轮流打印出结果。
三个线程可能会同时进行;
在多个CPU上:
22
难道就只有继承一条路了吗?
}
30
run()方法的覆盖
{ class TestThread implements Runnable private int sleepTime; public TestThread() { sleepTime = ( int ) ( Math.random() * 6000 ); } public void run() { try { System.out.println( Thread.currentThread().getName() + " going to sleep for " + sleepTime ); Thread.sleep( sleepTime ); } catch ( InterruptedException exception ) {}; System.out.println( Thread.currentThread().getName() + "finished" ); }
多 线 程 编 程 基 础
Application:解释器为每个main方法开始一个 线程; Applet:浏览器开始一个线程; 在程序中,创建附加线程,以执行并发任务。 每个线程都是一个对象; 可通过继承Thread类或实现Runnable接口方式
7
编程方法:
在Java中编写线程!
Thread类
new Thread(threadobj,"Thread1").start(); new Thread(threadobj,"Thread2").start(); new Thread(threadobj,"Thread3").start(); }
System.out.println( "Threads started, main ends\n" );
数据共享
29
线程间的数ቤተ መጻሕፍቲ ባይዱ共享
——例11_3
修改例11_2,只用一个Runnable类型的对象为参数创建3个新线程。
public class Ex11_3 { public static void main( String [] args ) { TestThread threadobj = new TestThread(); System.out.println( "Starting threads" );
法启动此线程就会在此线程上运行run()方法 在编写复杂程序时相关的类可能已经继承了某个基类,而Java
不支持多继承,在这种情况下,便需要通过实现Runnable接口
来生成多线程
24
使用Runnable接口实现Exa11_1功能
public class Exa11_1{
回 顾 一 下 前 面 的 程 序