JAVA专题技术综述之线程篇.pdf

上传人:小** 文档编号:88589157 上传时间:2019-05-04 格式:PDF 页数:12 大小:115.48KB
返回 下载 相关 举报
JAVA专题技术综述之线程篇.pdf_第1页
第1页 / 共12页
JAVA专题技术综述之线程篇.pdf_第2页
第2页 / 共12页
JAVA专题技术综述之线程篇.pdf_第3页
第3页 / 共12页
JAVA专题技术综述之线程篇.pdf_第4页
第4页 / 共12页
JAVA专题技术综述之线程篇.pdf_第5页
第5页 / 共12页
点击查看更多>>
资源描述

《JAVA专题技术综述之线程篇.pdf》由会员分享,可在线阅读,更多相关《JAVA专题技术综述之线程篇.pdf(12页珍藏版)》请在金锄头文库上搜索。

1、JAVA 专题技术综述JAVA 专题技术综述 之 线程篇线程篇 编写具有多线程能力的程序经常会用到的方法有: run(),start(),wait(),notify(),notifyAll(),sleep(),yield(),join() 还有一个重要的关键字:synchronized 本文将对以上内容进行讲解。 一:一:run()和和 start() 示例示例 1: public class ThreadTest extends Thread public void run() for(int i=0;i10;i+) System.out.print(“ “ + i); public sta

2、tic void main(String args) new ThreadTest().start(); new ThreadTest().start(); 这是个简单的多线程程序。run()和 start()是大家都很熟悉的两个方法。把希望并行处理的 代码都放在 run()中;stat()用于自动调用 run(),这是 JAVA 的内在机制规定的。并且 run() 的访问控制符必须是 public, 返回值必须是 void (这种说法不准确, run()没有返回值) , run() 不带参数。 这些规定想必大家都早已知道了,但你是否清楚为什么 run 方法必须声明成这样的形式?这涉 及到 J

3、AVA 的方法覆盖和重载的规定。这些内容很重要,请读者参考相关资料。 二:关键字二:关键字 synchronized 有了 synchronized 关键字,多线程程序的运行结果将变得可以控制。synchronized 关键 字用于保护共享数据。请大家注意“共享数据” ,你一定要分清哪些数据是共享数据,JAVA 是面向 对象的程序设计语言,所以初学者在编写多线程程序时,容易分不清哪些数据是共享数据。请看下 面的例子: 示例示例 2: public class ThreadTest implements Runnable 1 public synchronized void run() for(

4、int i=0;i10;i+) System.out.print(“ “ + i); public static void main(String args) Runnable r1 = new ThreadTest(); Runnable r2 = new ThreadTest(); Thread t1 = new Thread(r1); Thread t2 = new Thread(r2); t1.start(); t2.start(); 在这个程序中,run()被加上了 synchronized 关键字。在 main 方法中创建了两个线程。你 可能会认为此程序的运行结果一定为:0 1 2

5、 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9。但你 错了! 这个程序中 synchronized 关键字保护的不是共享数据 (其实在这个程序中 synchronized 关键字没有起到任何作用,此程序的运行结果是不可预先确定的) 。这个程序中的 t1,t2 是两个对 象(r1,r2)的线程。JAVA 是面向对象的程序设计语言,不同的对象的数据是不同的,r1,r2 有 各自的 run()方法,而 synchronized 使同一个对象的多个线程, 在某个时刻只有其中的一个线程 可以访问这个对象的 同一个对象的多个线程, 在某个时刻只有其中的一个线程 可以访问这个对象的 s

6、ynchronized 数据数据。每个对象都有一个“锁标志” ,当这个对象的一个线程 访问这个对象的某个 synchronized 数据时, 这个对象的所有被 synchronized 修饰的数据将被 上锁(因为“锁标志”被当前线程拿走了) ,只有当前线程访问完它要访问的 synchronized 数据 时,当前线程才会释放“锁标志” ,这样同一个对象的其它线程才有机会访问 synchronized 数据。 示例示例 3: public class ThreadTest implements Runnable public synchronized void run() for(int i=0

7、;i10;i+) System.out.print(“ “ + i); public static void main(String args) Runnable r = new ThreadTest(); Thread t1 = new Thread(r); Thread t2 = new Thread(r); t1.start(); 2 t2.start(); 如果你运行 1000 次这个程序,它的输出结果也一定每次都是:0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9。因为这里的 synchronized 保护的是共享数据。t1,t2 是同一个对象(r) 的

8、两个线程, 当其中的一个线程 (例如: t1) 开始执行 run()方法时, 由于 run()受 synchronized 保护,所以同一个对象的其他线程(t2)无法访问 synchronized 方法(run 方法) 。只有当 t1 执行完后 t2 才有机会执行。 示例示例 4: public class ThreadTest implements Runnable public void run() synchronized(this) for(int i=0;i10;i+) System.out.print(“ “ + i); public static void main(String

9、 args) Runnable r = new ThreadTest(); Thread t1 = new Thread(r); Thread t2 = new Thread(r); t1.start(); t2.start(); 这个程序与示例 3 的运行结果一样。在可能的情况下,应该把保护范围缩到最小,可以用示例 4 的形式, this 代表 “这个对象” 。 没有必要把整个 run()保护起来, run()中的代码只有一个 for 循环,所以只要保护 for 循环就可以了。 示例示例 5: public class ThreadTest implements Runnable publi

10、c void run() for(int k=0;k5;k+) System.out.println(Thread.currentThread().getName() + “ : for loop : “ + k); 3 synchronized(this) for(int k=0;k5;k+) System.out.println(Thread.currentThread().getName() + “ : synchronized for loop : “ + k); public static void main(String args) Runnable r = new ThreadT

11、est(); Thread t1 = new Thread(r,“t1_name“); Thread t2 = new Thread(r,“t2_name“); t1.start(); t2.start(); 运行结果: t1_name : for loop : 0 t1_name : for loop : 1 t1_name : for loop : 2 t2_name : for loop : 0 t1_name : for loop : 3 t2_name : for loop : 1 t1_name : for loop : 4 t2_name : for loop : 2 t1_na

12、me : synchronized for loop : 0 t2_name : for loop : 3 t1_name : synchronized for loop : 1 t2_name : for loop : 4 t1_name : synchronized for loop : 2 t1_name : synchronized for loop : 3 t1_name : synchronized for loop : 4 t2_name : synchronized for loop : 0 t2_name : synchronized for loop : 1 t2_name

13、 : synchronized for loop : 2 t2_name : synchronized for loop : 3 t2_name : synchronized for loop : 4 第一个 for 循环没有受 synchronized 保护。对于第一个 for 循环,t1,t2 可以同时访问。 运行结果表明 t1 执行到了 k=2 时,t2 开始执行了。t1 首先执行完了第一个 for 循环,此时 t2 4 还没有执行完第一个 for 循环(t2 刚执行到 k=2) 。t1 开始执行第二个 for 循环,当 t1 的第二 个 for 循环执行到 k=1 时,t2 的第一个

14、for 循环执行完了。t2 想开始执行第二个 for 循环,但 由于 t1 首先执行了第二个 for 循环,这个对象的锁标志自然在 t1 手中(synchronized 方法的 执行权也就落到了 t1 手中) ,在 t1 没执行完第二个 for 循环的时候,它是不会释放锁标志的。所 以 t2 必须等到 t1 执行完第二个 for 循环后,它才可以执行第二个 for 循环。 三:三:sleep() 示例示例 6: public class ThreadTest implements Runnable public void run() for(int k=0;k5;k+) if(k = 2) t

15、ry Thread.currentThread().sleep(5000); catch(Exception e) System.out.print(“ “ + k); public static void main(String args) Runnable r = new ThreadTest(); Thread t = new Thread(r); t.start(); sleep 方法会使当前的线程暂停执行一定时间(给其它线程运行机会) 。读者可以运行示例 6, 看看结果就明白了。sleep 方法会抛出异常,必须提供捕获代码。 示例示例 7: public class ThreadTe

16、st implements Runnable public void run() 5 for(int k=0;k5;k+) if(k = 2) try Thread.currentThread().sleep(5000); catch(Exception e) System.out.println(Thread.currentThread().getName() + “ : “ + k); public static void main(String args) Runnable r = new ThreadTest(); Thread t1 = new Thread(r,“t1_name“); Thread t2 = new Thread(

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 商业/管理/HR > 管理学资料

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号