设为首页 加入收藏

TOP

2011年计算机二级考试JAVA知识点整理(49)
2014-11-01 14:15:08 】 浏览:208
Tags:2011年 计算机 二级 考试 JAVA 知识点 整理

  1.7 Java 5.0多线程编程


  Java自1995年面世以来得到了广泛得一个运用,但是对多线程编程的支持Java很长时间一直停留在初级阶段。在Java 5.0之前Java里的多线程编程主要是通过Thread类,Runnable接口,Object对象中的wait()、 notify()、 notifyAll()等方法和synchronized关键词来实现的。这些工具虽然能在大多数情况下解决对共享资源的管理和线程间的调度,但存在以下几个问题


  1. 过于原始,拿来就能用的功能有限,即使是要实现简单的多线程功能也需要编写大量的代码。这些工具就像汇编语言一样难以学习和使用,比这更糟糕的是稍有不慎它们还可能被错误地使用,而且这样的错误很难被发现。


  2. 如果使用不当,会使程序的运行效率大大降低。


  3. 为了提高开发效率,简化编程,开发人员在做项目的时候往往需要写一些共享的工具来实现一些普遍适用的功能。但因为没有规范,相同的工具会被重复地开发,造成资源浪费。


  4. 因为锁定的功能是通过Synchronized来实现的,这是一种块结构,只能对代码中的一段代码进行锁定,而且锁定是单一的。如以下代码所示:


  synchronized(lock){


  //执行对共享资源的操作


  ……


  }


  一些复杂的功能就很难被实现。比如说如果程序需要取得lock A和lock B来进行操作1,然后需要取得lock C并且释放lock A来进行操作2,Java 5.0之前的多线程框架就显得无能为力了。


  因为这些问题,程序员对旧的框架一直颇有微词。这种情况一直到Java 5.0才有较大的改观,一系列的多线程工具包被纳入了标准库文件。这些工具包括了一个新的多线程程序的执行框架,使编程人员可方便地协调和调度线程的运行,并且新加入了一些高性能的常用的工具,使程序更容易编写,运行效率更高。本文将分类并结合例子来介绍这些新加的多线程工具。


  在我们开始介绍Java 5.0里的新Concurrent工具前让我们先来看一下一个用旧的多线程工具编写的程序,这个程序里有一个Server线程,它需要启动两个Component,Server线程需等到Component线程完毕后再继续。相同的功能在Synchronizer一章里用新加的工具CountDownLatch有相同的实现。两个程序,孰优孰劣,哪个程序更容易编写,哪个程序更容易理解,相信大家看过之后不难得出结论。


  public class ServerThread {


  Object concLock = new Object();


  int count = 2;


  public void runTwoThreads() {


  //启动两个线程去初始化组件


  new Thread(new ComponentThread1(this)).start();


  new Thread(new ComponentThread1(this)).start();


  // Wait for other thread


  while(count != 0) {


  synchronized(concLock) {


  try {


  concLock.wait();


  System.out.println("Wake up.");


  } catch (InterruptedException ie) { //处理异常}


  }


  }


  System.out.println("Server is up.");


  }


  public void callBack() {


  synchronized(concLock) {


  count--;


  concLock.notifyAll();


  }


  }


  public static void main(String[] args){


  ServerThread server = new ServerThread();


  server.runTwoThreads();


  }


  }


  public class ComponentThread1 implements Runnable {


  private ServerThread server;


  public ComponentThread1(ServerThread server) {


  this.server = server;


  }


  public void run() {


  //做组件初始化的工作


  System.out.println("Do component initialization.");


  server.callBack();


  }


  }


】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
上一篇2011年计算机二级考试JAVA知识点.. 下一篇2011年计算机二级考试JAVA知识点..

最新文章

热门文章

Hot 文章

Python

C 语言

C++基础

大数据基础

linux编程基础

C/C++面试题目