电子课件第11章_第1页
电子课件第11章_第2页
电子课件第11章_第3页
电子课件第11章_第4页
电子课件第11章_第5页
已阅读5页,还剩29页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、第11章 多线程,2,11.1、线程的概念,3,多线程程序、线程 多线程程序是指程序运行时,并发执行多个指令流,即多个任务同时执行。 进程 在计算机中执行的程序叫做进程 一个进程可以拥有一个或多个线程。 线程 又称为“轻量级的进程”,是进程内部单一的一个顺序指令流。 一个进程中的所有线程都生存在这个进程的空间中,共同使用进程的资源 一个进程至少有一个主线程,主线程由系统自动创建,用户只需在应用程序中创建其它线程,4,11.2、线程的创建,5,线程的创建 两种方式 定义Thread类的子类 实现Runnable接口,6,Thread类 类java.lang.Thread 创建、启动新线程 定义T

2、hread类的子类,重写Thread类中的run()方法 创建线程对象 调用线程对象的start()方法,启动线程,class FirstThread extends Thread FirstThread(String s) message = s; public void run() for(int i = 0;i 50 ; i+) System.out.println(message); public static void main(String args) FirstThread thread1 = new FirstThread(Thread 1); FirstThread thre

3、ad2 = new FirstThread(Thread 2); thread1.start(); thread2.start(); private String message; ,8,Runnable接口 定义在java.lang中 创建、启动新线程 定义一个实现Runnable接口的类,重写run()方法 创建该类的对象,并将此对象作为参数构造一个Thread类的对象 调用start()方法启动这个Thread类的对象,class FirstRunnable implements Runnable FirstRunnable(String s) message = s; public v

4、oid run() for(int i = 0; i 50; i+) System.out.println(message); public static void main(String args) FirstRunnable r1 = new FirstRunnable(Thread 1); FirstRunnable r2 = new FirstRunnable(Thread 2); Thread t1 = new Thread(r1); Thread t2 = new Thread(r2); t1.start(); t2.start(); private String message;

5、 ,10,11.3、线程的管理,11,线程的状态 一个线程可能处于以下四种状态之一:新建、可执行、阻塞、消亡,Thread类中常用的成员方法,13,import javax.swing.*; public class DemoApplet extends JApplet private JTextArea ta; public void init() ta = new JTextArea(5,10); ta.setText(初始化n); add(ta); public void start() ta.append(开始n); public void stop() ta.append(暂停n);

6、 ,class ThreadMethodTest public static void main(String args) MyThread t1 = new MyThread(Thread 1); MyThread t2 = new MyThread(Thread 2); t1.start(); t2.start(); try System.out.println(等待Thread 1 结束.); t1.join(); /等待t1运行结束后main线程继续运行 System.out.println(等待Thread 2 结束.); t2.join(); catch(InterruptedEx

7、ception e) System.out.println(e.toString(); System.out.println(主线程结束.); ,class MyThread extends Thread MyThread(String s) name = s; public void run() try System.out.println(name + 启动.); sleep(10000); / 休眠10秒钟 System.out.println(name + 结束); catch(InterruptedException e) System.out.println(e.toString(

8、); private String name; ,Thread 1启动. Thread 2启动. 等待Thread 1 结束. Thread 1结束 Thread 2结束 等待Thread 2 结束. 主线程结束.,16,线程同步 异步 vs 同步 线程同步 多个线程间需要合作完成任务或同时使用相同且有限的资源时,需要使用线程同步机制,class WithoutSync implements Runnable public static void main(String args) WithoutSync w1 = new WithoutSync(); Thread t1 = new Thre

9、ad(w1); Thread t2 = new Thread(w1); t1.start(); t2.start(); public void run() int tmp; for(int i = 0,tmp = value+1; i 5; i+, tmp = value + 1) try Thread.sleep(1000); /线程休眠1000毫秒 catch(Exception e) System.out.println(e.toString(); value = tmp; System.out.println(Thread.currentThread().getName() + val

10、ue is + value); private int value; ,Thread-0 value is 1 Thread-1 value is 1 Thread-1 value is 2 Thread-0 value is 2 Thread-1 value is 3 Thread-0 value is 3 Thread-1 value is 4 Thread-0 value is 4 Thread-0 value is 5 Thread-1 value is 5,18,线程同步 关键字synchronized synchronized(syncObject) 所有对象都有且仅有一个锁,当线

11、程需要访问共享资源时必须先获得syncObject的锁(上锁),成功后方可进入synchronized代码块访问资源,否则进入阻塞状态。,class WithSync implements Runnable public static void main(String args) public void run() int tmp; for(int i = 0; i 5; i+) synchronized(this) /将当前对象作为同步访问的锁 tmp = value + 1; /将value的访问语句放置在同步块中 try Thread.sleep(1000); catch(Excepti

12、on e) System.out.println(e.toString(); value = tmp; System.out.println(Thread.currentThread().getName() + value is + value); public int value; ,public static void main(String args) WithSync w1 = new WithSync(); Thread t1 = new Thread(w1); Thread t2 = new Thread(w1); t1.start(); t2.start(); ,Thread-0

13、 value is 1 Thread-1 value is 2 Thread-0 value is 3 Thread-1 value is 4 Thread-0 value is 5 Thread-1 value is 6 Thread-0 value is 7 Thread-1 value is 8 Thread-0 value is 9 Thread-1 value is 10,21,线程同步 sychronized方法 synchronized returnType methodName(parameter) 调用某个对象的任何一个synchronized方法,这个对象都会被锁定 run

14、()方法不应该声明为synchronized方法 死锁,22,等待与通知 适用于“有条件”的同步问题 wait notify,方法wait与notify,import java.util.*; class WaitTest class Sender extends Thread public void run() for(int i =0; i 10; i+) synchronized(this) if(available) /同步访问变量available try this.wait(); /若新消息未接收,则发送线程等待 catch(Exception e) message = (int)

15、(Math.random() * 100);/产生1-100的随机数 System.out.println(Sending + message); synchronized(this) available = true; this.notify(); /新消息发送完成,通知接收线程 int message; /待发送的消息 boolean available; /是否有新消息 ;,class Receiver extends Thread Sender s; Receiver(Sender tmp) s = tmp; public void run() for(int i =0; i 10;

16、i+) synchronized(s) if(!s.available) try s.wait(); /若无新消息可接收,则进入等待状态 catch(Exception e) System.out.println(Receiving + s.message); synchronized(s) s.available = false; s.notify(); /接收消息结束,通知发送线程 ,class WaitTest public static void main(String args) Sender s = new Sender(); Receiver r = new Receiver(s

17、); /s作为参数构造一个Receiver对象 s.start(); r.start(); ,Sending 27 Receiving 27 Sending 13 Receiving 13 Sending 31 Receiving 31 Sending 59 Receiving 59 Sending 99 Receiving 99 Sending 0 Receiving 0 Sending 36 Receiving 36 Sending 66 Receiving 66 Sending 73 Receiving 73 Sending 4 Receiving 4,27,11.4、优先级与线程组,2

18、8,优先级 线程的优先级用于表示线程的重要性 Java中提供了10个的优先级 方法getPriority 取得线程的优先级 方法setPriority 设置线程的优先级 实际开发中一般不更改线程的优先级,29,线程组 Java采用“线程组”来管理线程 所有的线程都属于某个线程组 线程组也隶属于某个线程组 ThreadGroup类,ThreadGroup类常用构造方法,ThreadGroup类常用方法,class ThreadInfo public static void main(String args) public static void printThreadGroupInfo(Thre

19、adGroup group) public static void printThreadInfo(Thread t) ,public static void printThreadGroupInfo(ThreadGroup group) if( group = null) return; System.out.println(线程组: + group.getName()+ 最大优先级: + group.getMaxPriority(); int num_of_threads = group.activeCount(); Thread threads = new Threadnum_of_threads; num_of_threads = group.enumerate(threads,false);/枚举线程 for(int i = 0; i num_of_threads; i+) printThreadInfo(threadsi); int num_of_groups = group.activeGroupCount(); ThreadGroup groups = new ThreadGroupnum_of_groups; num_of_groups = group.enumera

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

最新文档

评论

0/150

提交评论