当前位置:文档之家› 多线程程序设计模板

多线程程序设计模板



Java将线程的优先级分为 10 个等级,分别用 1-10 之间的数字表示。数字越大表明线程的级别越高。 相应地,在Thread类中定义了表示线程最低、最高 和 普 通 优 先 级 的 成 员 变 量 MIN_PRIORITY、 MAX_PRIORITY和NORMAL_PRIORITY,代表的优 先级等级分别为 1 、 10 和 5 。当一个线程对象被创 建时,其默认的线程优先级是5。
13
new Thread(..)
消亡 创建状态 run() 结束 stop()
获得CPU
start()
就绪状态
sleep时间到 resume() notify()或notifyAll()
运行状态 yield()
sleep()
I/O完成
suspend() wait() Thread)
16
阻塞状态(Blocked)
线程处于运行状态时,当下面四种情况发生,线程就进入 不可运行(阻塞)状态: 调用了sleep()方法; 调用了suspend()方法; 为等候一个条件变量,线程调用wait()方法; 输入输出流中发生线程阻塞。
Thread myThread = new MyThreadClass(); myThread.start(); try { myThread.sleep(10000); } catch (InterruptedException e){ }
3

线程与进程的区别
一个进程中可以包含多个线程。一个线程是一个程序内 部的顺序控制流。主要区别如下: 1. 进程:每个进程都有独立的代码和数据空间 (进程上下文) ,进程切换的开销大。 2. 线程:轻量的进程,同一类线程共享代码和数 据空间,每个线程有独立的运行栈和程序计数器 (PC),线程切换的开销小。 3. 多进程:在操作系统中,能同时运行多个任务 程序。 4. 多线程:在同一应用程序中,有多个顺序流同 时执行。
创建一个归属于group线程组,名称为name的线程
创建一个归属于group线程组,target为参数的线程 返回当前线程的线程组中活动线程的数目
返回当前的线程对象
返回该线程的ID,每个线程都有一个唯一的ID 返回该线程的名称 返回该线程的优先级 返回该线程的状态,以监视系统的运行状态 返回当前的线程组
//线程自然撤销 public void run() { int i = 0; while (i < 100) { i++; System.out.println("i = " + i); } } //线程被强行停止 myThread thd = new MyThread(); thd.start( ); try { thd.sleep(10000); } catch (InterruptedException e){ } thd.stop( );
4

使用多线程进行程序设计具有如下优点: ① 多线程编程简单,效率高(能直接共享数据和资源,多 进程不能) ② 适合于开发服务程序(如Web服务,聊天服务等) ③ 适合于开发有多种交互接口的程序(如聊天程序的客户 端,网络下载工具) ④ 减轻编写交互频繁、涉及面多的程序的困难(如监听网 络端口) ⑤ 程序的吞吐量会得到改善(同时监听多种设备,如网络 端口、串口、并口以及其他外设) ⑥ 有多个处理器的系统,可以并发运行不同的线程(否则, 任何时刻只有一个线程在运行)
17
对于这四种使得线程处于不可运行状态的情况,都有特定的 方法使线程返回可运行状态: 如果线程处于睡眠状态中,sleep()方法中的参数为休息时间,当这
个时间过去后,线程即为可运行的; 如果一个线程被挂起,须调用resume()方法来返回; 如果线程在等待条件变量,那么要停止等待的话,需要该条件变量 所在的对象调用notify()或notifyAll()方法; 如果在I/O流中发生线程阻塞,则特定的I/O指令将结束这种不可运行 状态。
设置该线程是否为守护线程
设置线程的名称 设置线程的优先级
使该线程休眠millis毫秒 启动该线程,JVM会调用该线程对象的run()方法 强制停止该线程,已过时 挂起该线程,已过时 暂停当前线程,让处于活动状态的线程重新抢占 控制权
10

该方法通过生成实现 ng.Runnable接口的类。 该接口只定义了一个方法 run(),所以必须在新 类中实现它。但是 Runnable 接口并没有任何对线 程的支持,我们还必须创建 Thread 类的实例,这 一点通过 Thread 类的构造方法 public Thread(Runnable target); 来实现。
需要注意的是每种方法都仅仅对相应的情况才有作用,例 如当一个线程睡眠并且睡眠时间还没有结束时,调用resume() 方法是无效的,并且还会引起非法状态例外。
18
死亡状态(Dead)
线程的终止一般可通过两种方法实现:自然撤消或是被停 止。自然撤消是指从线程的run()方法正常退出;而调用线程 的实例方法stop()则可以强制停止当前线程。
当创建了一个新的线程时(
myThread thd = new myThread();
),它
就处于创建状态,此时它仅仅是一个空的线程对象,系统不为 它分配资源。处于这种状态时只能启动或终止该线程,调用除 这两种以外的其它线程状态相关的方法都会失败并且会引起非 法状态例外IllegalThreadStateException(对于其它状态,若所
11

3.1 线程生命周期 3.2 线程调度和优先级
12

线程是动态的,具有一定的生命周期,分别经历从 创建、执行、阻塞直到消亡的过程。在每个线程类 中都定义了用于完成实际功能的run方法,这个run 方法称为线程体(Thread Body)。按照线程体在 计算机系统内存中的状态不同,可以将线程分为创 建(new)、就绪(runnable)、运行(running)、阻塞 (blocked)和死亡(dead)5个状态。
19
可以通过在其他线程中调用stop()方法来终止线程,也 可以由线程自己调用stop()方法,自我终止。 如果希望线程正常终止,可采用标记来使线程中的run() 方法退出。
//线程自我终止 public void run() { while ( true ) { … //完成线程的特定功能 if( time_to_die ) { Thread.currentThread().stop(); } } }
5



Hotjava浏览器就是一个多线程应用的实例。当下 载一个应用程序或图片时,可以同时进行其他任务, 例如播放动画或声音的应用程序、打印某些内容、 进行排序或者其他工作。 聊天室(多人同时聊) Web服务器 ,如: Tomcat、Resin、WebSphere 数据库系统,如:MSSQLServer、Oracle
9
public void interrupt()
public static boolean interrupted()
public final boolean isAlive() public final boolean isDaemon() public boolean isInterrupted() public final void join() public final void resume() public void run() public final void setDaemon(boolean on) public final void setName(String name) public final void setPriority(int newPriority) public static void sleep(long millis) public void start() public final void stop() public final void suspend() public static void yield()
6

线程所执行的代码通过方法run()(包含在一个特
定的对象中, 称为线程体)来完成。通常,run( ) 方法是一个循环,例如:一个播放动画的线程要循 环显示一系列图片。run( )方法有时会执行一个时 间较长的操作,例如:下载并播放一个JPEG格式的
电影。创建线程并初始化后,Java的运行时系统自动
调用的方法与状态不符,都会引起非法状态例外)。
15
就绪状态(Runnable)
当线程处于新建状态时,可以调用start()方法( thd.start(); ) 来启动它,产生运行这个线程所需的系统资源,安排其运行, 并调用线程体run()方法,这样就使得该线程处于可运行 ( Runnable )状态。 需要注意的是这一状态并不是运行中状态(Running ),因为 线程也许实际上并未真正运行(Ready)。由于很多计算机都 是单处理器的,所以要在同一时刻运行所有的处于可运行状态 的线程是不可能的,Java运行系统必须实现调度来保证这些线 程共享处理器。但是在大多数情况下,可运行状态也就是运行 中。当一个线程正在运行时,它是可运行的,并且也是当前正 运行的线程。
1

1 2 3 4 5 6 7
线程的概念 线程的创建 线程的生命周期及调度 线程互斥 线程同步 线程通信 线程死锁
2



程序(Program):程序是含有指令和数据的文件,被存储 在磁盘或其他的数据存储设备中,程序是静态的代码。 进程(Process):进程是程序的一次执行过程,是系统运 行程序的基本单位,因此进程是动态的。 线程(Thread):线程是一个比进程更小的执行单位。一个 进程在其执行过程中可以产生多个线程,形成多条执行线 路。
调用run( )方法,实现线程所要完成的功能。
相关主题