
关于java语言实现并发编程的研究综述.doc
10页关于java语言实现并发编程的研究综述【摘要】JAVA 一个重要的特点就是支持多线程编程,多线程编程是实现并发编程的一种方 式木文简述了与并发编程相关的一些概念,并通过实例阐述了如何利用多线程进行并发 编程,介绍了 JAVA多线程的同步机制以及死锁等问题关键词】JAVA;多线程;并发编程、背景随着多核处理器的普及,以及人们对高性能计算需求的不断扩大和各种新技术的出现, 并发编程模型也处于不断的发展和完善之中传统编程环境通常是单线程的,而Java是支 持多线程的由于一个CPU在同一时刻只能执行一个程序中的一条指令,所以在单核处理 器环境下,人们所看到的程序能够并行的执行,实际上是进程被交替执行,表现出一种并发 的外部特种,是伪并行;而在多核处理器的环境下,才是真并行,进程不仅可以交替执行, 而且可以重叠执行并行编程是在多核处理器的情况下才会出现的,本文就着重讨论下多核 处理器下的并发/多线程编程二、并发等相关概念概述1、 并发与并行并发是指两个或多个程序在同一时间间隔内发生,如果在单核处理器上,看似程序同时执行, 实际上是交替执行;如果在多核处理器上,我们看到的也是同时执行,实际上乂分为两种情 况:一种是程序在不同的处理器上在同一时刻同时执行,我们把这种情况称为并行;另一种 情况就是交替执行。
所以只有在多核处理器的情况下才有可能实现并行,并行具有并发的含 义,而并发不一定是并行2、 同步与异步同步是指发送一个请求等待返回,然后再发送下一个请求;异步是指发送一个请求不等 待返回,随时可以再发送下一个请求异步和同步是相对的,同步就是顺序执行,执行完一 个再执行下一个,需要等待、协调运行异少就是彼此独立,在等待某事件的过程中继续做 日己的事,不需要等待这个事件完成后再工作3、 进程与多线程进程是指程序的一次执行过程,或是正在运行的一 •个程序,它具有一个独立的执行环境线程有时也被称为轻量级的进程,线程是进程的进一步细化,是一个程序内部的一条执行路 径,若一个程序可同一时间执行多个线程,就是支持多线程的4、异步与多线程异步和多线程并不是一个同等关系,异步是最终目的,多线程只是我们实现异步的一个 方式异步是让调用方法的主线程不需要同步等待另一线程的完成,从而可以让主线程干其 它的事情java多线程编程的优缺点我们知道Java语言具有简单性、纯面向对象、可移植性、健壮性、安全性、分布性等 特点,同时Java语言也提供了对多线程的良好支持,使得资源利用率更好,程序设计在某 些情况下也更简单,程序响应更快等,正是因为有这些优点,多线程一直发展至今。
事情总有两面性,从一个单线程的应用到一个多线程的应用并不仅仅带来好处,也会有 一些代价多线程程序设计更复杂,虽然有时候一-些多线程的程序比单线程的程序要简单一 些,但其他方面都更为复杂,比如多线程访问共享数据时,如不进行同步处理,就会容易造 成访问数据错误,对于这样的错误又很难发现,并且问题难以重现及修复;还有等待临界资 源时,也会使速度下降;线程在运行时不仅占用cpu,同时也需要一些内存来维持它木地的 堆栈,还要占用操作系统中的一些资源,这增加了资源的消耗;对线程的管理也会增加CPU 的额外负担;由于缺乏成效,但又很复杂将会降低效率;还有线程的饥饿、竞争和死锁等问 题,这些都有待于继续研究四、利用Java多线程机制实现并发编程1、多线程编程形式创建线程需要一定的步骤,首先要创建线程,然后为其指定工作,当工作结整后再毙掉 该线程通常在Java中线程的编程形式有两种:(1)继承Thread类1) 定义了类继承Thread类;2) 子类中重写Thread类中的run方法;3) 创建Thread子类对象,即创建了线程对象;4) 调用线程对象start h法:启动线程,调用run方法class PrintNum extends Thread{public void run()(for(int i = l;i <= 10;i++)(System.out.println("继承 Thread 类…>"+Thread.currentThread().getName() + ":" + i);}))public class test(public static void main(String[] args) {PrintNum pl = new PrintNum();PrintNum p2 = new PrintNum();pl.start();p2.start();))图1图2是程序执行结果,因为线程是交替执行,所以执行的结果也会不同继承Thread类- 继承Thread类- ^^ThreadlS- 继承Thread类- 继承Thread类- 继承Thread类- 继承Thread类・ il^Thread^- 继承Thread类・ itt^Threadft- 继承 Thready • 继承 Threat^ 继承Threat^・ 纸承 Threat^- 继承Thread类- 继承 Threat^- 继承Thread类- ^^Thread^- ^^Thread^- 继承Thread类->Thread-0:1 >Thread-l:1 >Thread-l:2 >Thread-l:3 >Thread-l:4 >Thread-l:5 >Thread-l:6 >Thread-1:7 >Thread-l:8 >Thread-l:9 >Thread-l:10 >Thread-0:2 >Thread-0:3 >Thread-0:4 >Thread-0:5 >Thread-0:6 >Thread-0:7 >Thread-0:8 >Thread-0:9 >Thread-0:10继承Thread类- 继承Thread类- ^^Thread^- 狠承Thread类- ^^Threadft- ^^ThreadSJ- 继承仆心如类・ 继承Thread类- 继承Thread类・ 继承Thread类- 继承Thread类- 继承仆广况类・ 继承Thread类- 继承仆心2类・ 继承 Thread?} 继承Thread类・ 继承Thread类・ ^^Thread^- 继承Threat^・ 继承Thread类--->Thread-0:1 -->Thread-l:1 -->Thread-l:2 -->Thread-l:3 -->Thread-l:4 -->Thread-l:5 -->Thread-0:2 -->Thread-0:3 -->Thread-0:4 -->Thread-0:5 -->Thread-0:6 -->Thread-0:7 -->Thread-0:8 -->Thread-0:9 -->Thread-0:10 -->Thread-l:6 -•>Thread-l:7 -->Thread-l:8 -->Thread-l:9 -->Thread-l:10图1图2(2)实现 Runnable 接口1) 定义了类,实现Runnable接口;2) 子类中重写Runnable接口中的run方法;3) 通过Thread类含参构造器创建线程对象;4) 将Runnable接口的子类对象作为实际参数传逆给Thread类的构造方法中;5) 调用Thread类的start方法:开启线程,调用Runnable 了类接口的run方法。
如下代码:用接口的形式实现两个线程打印10以内的自然数class PrintNuml implements Runnable (public void run()(for(int i = l;i <= 10;i++)(System.out.printlnC实现 Runnable 接口・・・>”+Thread.currentThread().getName() +":" + i);}))public class test(public static void main(String[] args) (PrintNuml p = new PrintNuml();Thread tl = new Thread(p);Thread t2 = new Thread(p);tl.start();t2.start();}}图3图4是程序执行结果,用实现接口的形式跟继承都E以达到同样的目的实现Runnable接口 实现Runnable接口 实现Runnable接口 实现Runnable接口 实现Runnable接口 实现Runnable接口 实现Runnable接口 实现Runnable接口 实现Runnable授口 买现Runnable授口 实现Runnabl嗨口 实现Runnable授口 实现Runnable接口 实现Runnable接口 实现Runnable接口 实现Runnable接口 实现Runnable接口 实现Runnable接口 实现Runnable接口 实现Runnable接口>Thread-0:1 >Thread-l:1 >Thread-l:2 >Thread-l:3 >Thread-l:4 >Thread-l:5 >Thread-l:6 >Thread-l:7 >Thread-l:8 >Thread-l:9 >Thread-l:10 >Thread-0:2 >Thread-0:3 >Thread-0:4 >Thread-0:5 >Thread-0:6 >Thread-0:7 >Thread-0:8 >Thread-0:9 >Thread-0:10实现 Runnable 接口- 实现 Runnable 接口- 实现 Runnable 接口- 实现 Runnable 接口- 实现Runnable插口・ 实现Runnable掐口・ 实现Runnable搔口・ 实现 Runnable 接口- 实现Runnable接口・ 实现Runnable接口・ 实现 Runnable 接口- 实现Runnable接口・ 实现Runnable接口・ 实现Runnable接口・ 实现Runnabl啪口・ 实现 Runnable 插口 • 实现Runnable接口・ 实现 Runnable 接口- 实现Runnable接口・ 实现 Runnable 接口--->Thread-0:1 -->Thread-l:1 -->Thread-0:2 -->Thread-0:3 -->Thread-0:4 -->Thread-l:2 -->Thread-l:3 -->Thread-l:4 -->Thread-l:5 -->Thread-l:6 -->Thread-l:7 -->Thread-l:8 -->Thread-l:9 -->Thread-l:10 -->Thread-0:5 -->Thread-0:6 -->Thread-0:7 -->Thread-0:8 -->Thread-0:9 -->Thread-0:102、设置线程的优先级如上图执行结果所示,当有多个线程运行时优先抢占到CPU的线程得以优先执行,实 际中可能每个线程的重要程度不尽相同,需要让某些线程优先执行,这就涉及到线程的优先 级了,优先级高的线程得到CPU的时间长一些,但也不是说优先级高的全部执行完才执行 优先级低的,而是优先级高的获取执行权的概率要高一些。
优先级的设置要注意几点:⑴确定优先级必须采用1~10之间的整数;(2)父线程的优先级要被子线程所继承;⑶线程的优先级可以通过setpriority()的调用进行改变在第一个程序代码中加入如下两行代码,分别设置pl的优先级为1, p2的优先级为10,则 P2可能就。






![河南新冠肺炎文件-豫建科[2020]63号+豫建科〔2019〕282号](http://img.jinchutou.com/static_www/Images/s.gif)





