【Java精品源码栏目提醒】:网学会员在Java精品源码频道为大家收集整理了“【精品】java语言程序设计_郑莉 第8章 - 网络与通信“提供大家参考,希望对大家有所帮助!
JAVA语言程序设计 第八章 线程 郑 莉目录 多线程编程基础 线程的生命周期 线程的优先级 本章小结 28.1 多线程编程基础 本节内容 – 线程的概念 – Thread类 – Runnable接口 – 线程间的数据共享 – 多线程的同步控制 – 线程之间的通信 – 后台线程 3 8.1.1 线程的概念多 进程和线程的区别线 进程程编 – 一个独立程序的每一次运行称为一个进程,例如程 用字处理软件编辑文稿时,同时打开mp3播放程序听音乐,基 这两个独立的程序在同时运行,称为两个进程础 – 设置一个进程要占用相当一部分处理器时间和内存资源 – 大多数操作系统不允许进程访问其他进程的内存空间,进 程间的通信很不方便,编程模型比较复杂 4 8.1.1 线程的概念续 线程多 – 一个程序中多段代码同时并发执行,称为多线程线程 – 通过多线程,一个进程表面上看同时可以执行一个以上的编 任务——并发程 – 创建线程比创建进程开销要小得多,线程之间的协作和数基 据交换也比较容易础 –
Java是第一个支持内置线程操作的主流编程语言 – 多数程序设计语言支持多线程要借助于操作系统“原语 primitives” 5 8.1.2 Thread类 Thread类多 – 在
Java程序中创建多线程的方法之一是继承Thread类线程 – 封装了
Java程序中一个线程对象需要拥有的属性和方法编 – 从Thread类派生一个子类,并创建这个子类的对象,就程 可以产生一个新的线程。
这个子类应该重写Thread类的基 run方法,在run方法中写入需要在新线程中执行的语句础 段。
这个子类的对象需要调用start方法来启动,新线程 将自动进入run方法。
原线程将同时继续往下执行 – Thread类直接继承了Object类,并实现了Runnable接口。
它位于
java.lang包中,因而程序开头不用import任何包就 可直接使用 6 8.1.2 Thread类续 ——例8_1 在新线程中完成计算某个整数的阶乘多 public class Ex8_1 线 public static void main String args 程 System.out.printlnmain thread starts编 FactorialThread threadnew FactorialThread10 thread.start程 System.out.printlnmain thread ends 基 础 class FactorialThread extends Thread private int num public FactorialThread int num this.numnum 7 8.1.2 Thread类续 ——例8_1运行结果 public void run int inum多 int result1线 System.out.printlnnew thread started whilei0 程 resultresulti编 ii-1 程 System.out.printlnThe factorial of num is result基 System.out.printlnnew thread ends 础 运行结果 main thread starts main thread ends new thread started The factorial of 10 is 3628800 new thread ends 8 8.1.2 Thread类续 ——例8_1修改 结果说明多 – main线程已经执行完后,新线程才执行完线程 – main函数调用thread.start方法启动新线程后并不等待编 其run方法返回就继续运行,thread.run函数在一边独自程 运行,不影响原来的main函数的运行基 源程序修改础 – 如果启动新线程后希望主线程多持续一会再结束,可在 start语句后加上让当前线程(这里当然是main)休息1毫 秒的语句: try Thread.sleep1 catchException e 9 8.1.2 Thread类续 ——例8_1修改后运行结果多 修改后运行结果线 main thread starts程 new thread stared编 The factorial of 10 is 3628800程 new thread ends基 main thread ends础 运行结果说明 – 新线程结束后main线程才结束 10 8.1.2 Thread类续 ——常用API函数多 名称 说明线 public Thread 构造一个新的线程对象,默认名为Thread-n,程 n是从0开始递增的整数编 public ThreadRunnable 构造一个新的线程对象,以一个实现Runnable 接口的类的对象为参数。
默认名为Thread-n,程 target n是从0开始递增的整数基 public ThreadString name 构造一个新的线程对象,并同时指定线程名础 public static Thread 返回当前正在运行的线程对象 currentThread public static void yield 使当前线程对象暂停,允许别的线程开始运行 public static void 使当前线程暂停运行指定毫秒数,但此线程并 sleeplong millis 不失去已获得的锁旗标。
11 8.1.2 Thread类续 ——常用API函数 启动线程,JVM将调用此线程的run方法,多 public void start 结果是将同时运行两个线程,当前线程和线 执行run方法的线程程 public void run Thread的子类应该重写此方法,内容应为编 该线程应执行的任务。
程 public final void stop 停止线程运行,释放该线程占用的对象锁 旗标。
基 public void interrupt 打断此线程础 在当前线程中加入调用join方法的线程A, public final void join 直到线程A死亡才能继续执行当前线程 在当前线程中加入调用join方法的线程A, public final void 直到到达参数指定毫秒数或线程A死亡才 joinlong millis 能继续执行当前线程 12 8.1.2 Thread类续 ——常用API函数 public final void多 setPriority 设置线程优先级线 int newPriority程 设置是否为后台线程,如果当前运行线程编 public final void 均为后台线程则JVM停止运行。
这个方法必 setDaemonBoolean on程 须在start方法前使用基 public final void 判断当前线程是否有权力修改调用此方法础 checkAccess 的线程 public void setNameString 更该本线程的名称为指定参数 name public final boolean 测试线程是否处于活动状态,如果线程被 isAlive 启动并且没有死亡则返回true 13 8.1.2 Thread类续 ——例8_2 创建3个新线程,每个线程睡眠一段时间(0~6秒),然多 后结束线 public class Ex8_2 程 public static void main String args 编 //创建并命名每个线程 TestThread thread1 new TestThread thread1 程 TestThread thread2 new TestThread thread2 基 TestThread thread3 new TestThread thread3 础 System.out.println Starting threads thread1.start // 启动线程1 thread2.start // 启动线程2 thread3.start // 启动线程3 System.out.println Threads started main endsn 14 8.1.2 Thread类续 ——例8_2 class TestThread extends Thread 多 private int sleepTime public TestThread String name 线 super name 程 sleepTime int Math.random 6000 编 程 public void run 基 try System.out.println础 getName going to sleep for sleepTime Thread.sleep sleepTime //线程休眠 catch InterruptedException exception System.out.println getName finished 15 8.1.2 Thread类续 ——例8_2运行结果 运行结果多 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休眠时 间最短,所以最先结束 – 每次运行,都会产生不同的随机休眠时间,所以结果都 不相同 16 8.1.3 Runnable接口 Runnable接口多 –
Java多线程机制的一个重要部分,实际上它只有一个线程 run方法编 – Thread类实现了Runnable接口,相对于Thread类,它更适程 合于多个线程处理同一资源基 – 实现Runnable接口的类的对象可以用来创建线程,这时础 start方法启动此线程就会在此线程上运行run方法 – 在编写复杂程序时相关的类可能已经继承了某个基类, 而
Java不支持多继承,在这种情况下,便需要通过实现 Runnable接口来生成多线程 17 8.1.3 Runnable接口续 ——例8_3多 使用Runnable接口实现例8_1功能线 public class Ex8_1程 public static void main String args 编程 System.out.printlnmain thread starts基 FactorialThread tnew FactorialThread10础 new Threadt.start System.out.printlnnew thread startedmain thread ends 18 8.1.3 Runnable接口续 ——例8_3 class FactorialThread implements Runnable 多 private int num线 public FactorialThread int num this.numnum程 编 public void run 程 int inum基 int result1 whilei0 础 resultresulti ii-1 System.out.printlnThe factorial of num is result System.out.printlnnew thread ends 19 8.1.3 Runnable接口续 ——例8_4 使用Runnable接口实现例8_2功能多 public class Ex8_4线 public static void main String args 程 TestThread thread1 new TestThread TestThread thread2 new TestThread编 TestThread thread3 new TestThread程 System.out.println Starting threads 基础 new Threadthread1Thread1.start new Threadthread2Thread2.start new Threadthread3Thread3.start System.out.println Threads started main endsn 20