天天加油 - 助您成才
如何使用Java编写多线程程序
您正在看的Java是:如何使用Java编写多线程程序。
  一、简介
  
  1、什么是线程
  
  要说线程,就必须先说说进程,进程就是程序的运行时的一个实例。线程呢可以看作单独地占有CPU时间来执行相应的代码的。对早期的计算机(如DOS)而言,线程既是进程,进程既是进程,因为她是单线程的。当然一个程序可以是多线程的,多线程的各个线程看上去像是并行地独自完成各自的工作,就像一台一台计算机上运行着多个处理机一样。在多处理机计算机上实现多线程时,它们确实可以并行工作,而且采用适当的分时策略可以大大提高程序运行的效率。但是二者还是有较大的不同的,线程是共享地址空间的,也就是说多线程可以同时读取相同的地址空间,并且利用这个空间进行交换数据。
  
  2、为什么要使用线程
  
  为什么要使用多线程呢?学过《计算机体系结构》的人都知道。将顺序执行程序和采用多线程并行执行程序相比,效率是可以大大地提高的。比如,有五个线程thread1, thread2, thread3, thread4, thread5,所耗的CPU时间分别为4,5,1,2,7。(假设CPU轮换周期为4个CPU时间,而且线程之间是彼此独立的)顺序执行需要花费19个CPU时间,而并行需要的时间肯定少于19个CPU时间,至于具体多少时间要看那些线程是可以同时执行的。这是在非常小规模的情况下,要是面对大规模的进程之间的交互的话,效率可以表现得更高。
  
  3、Java中是如何实现多线程的
  
  与其他语言不一样的是,线程的观念在java是语言中是重要的,根深蒂固的,因为在java语言中的线程系统是java语言自建的, java中有专门的支持多线程的API库,所以你可以以最快的速度写一个支持线程的程序。在使用Java创建线程的时候,你可以生成一个Thread类或者他的子类对象,并给这个对象发送start()消息(程序可以向任何一个派生自 Runnable 接口的类对象发送 start() 消息的),这样一来程序会一直执行,直到run返回为止,此时该线程就死掉了。
  
  在Java语言中,线程有如下特点:
  
  § 在一个程序中而言,主线程的执行位置就是main。而其他线程执行的位置,程序员是可以自定义的。值得注意的是对Applet也是一样。
  
  § 每个线程执行其代码的方式都是一次顺序执行的。
  
  § 一个线程执行其代码是与其他线程独立开来的。如果诸线程之间又相互协作的话,就必须采用一定的交互机制。
  
  § 前面已经说过,线程是共享地址空间的,如果控制不当,这里很有可能出现死锁。
  
  各线程之间是相互独立的,那么本地变量对一个线程而言就是完全独立,私有的。所以呢,线程执行时,每个线程都有各自的本地变量拷贝。对象变量(instance variable)在线程之间是可以共享的,这也就是为什么在java中共享数据对象是如此的好用,但是Java线程不能够武断地访问对象变量:他们是需要访问数据对象的权限的。
  
  二、准备知识
  
  在分析这个例子之前,然我们先看看关于线程的几个概念,上锁,信号量,和Java所提供的API。
  
  上锁
  
  对于大多数的程序而言,他们都需要线程之间相互的通讯来完成整个线程的生命周期,二实现线程之间同步的最简单的办法就是上锁。为了防止相互关联的两个线程之间错误地访问共享资源,线程需要在访问资源的时候上锁和解锁,对于锁而言,有读锁,写锁和读写锁等不同的同步策略。在Java中,所有的对象都有锁;线程只需要使用synchronized关键字就可以获得锁。在任一时刻对于给定的类的实例,方法或同步的代码块只能被一个线程执行。这是因为代码在执行之前要求获得对象的锁。
  
  信号量
  
  通常情况下,多个线程所访问为数不多的资源,那怎么控制呢?一个比较非常经典而起非常简单的办法就是采用信号量机制。信号量机制的含义就是定义一个信号量,也就是说能够提供的连接数;当有一个线程占用了一个连接时,信号量就减一;当一个线程是放了连接时,信号量就加一。采用这种方法就可以简单有效地控制线程的同步问题,而且实现起来也特别方便。看下面的代码:
  
  class Semaphore {
  private int count;
  public Semaphore(int count) {
  this.count = count;
  }
  
  public synchronized void acquire() {
  while(count == 0) {
  try {
  wait();
  } catch (InterruptedException e) {
  //keep trying
  }
  }
  count--;
  }
  
  public synchronized void release() {
  count++;
  notify(); //alert a thread that′s blocking on this semaphore
  }
  }
  
  Java中提供了哪些api以编写多线程程序
  
  这里只列出几个常用的方法和属性值。
  
  属性值,有三个MAX_PRIORITY,MIN_PRIORITY,NORM_PRIORITY
  
  方法:
  
  Thread(); //建立一个线程
  void run(); //对于一个继承了Runnable接口的class而言,
  //他运行一个线程,否着他什么都不做
  void setPriority(int newPriority); //设置优先级
  void start(); //运行一个程序
  void sleep(long millis); //线程睡眠millis毫秒
  static void yield(); //临时pa

排行

  1. 红旗Linux桌面6安装图解
  2. Mysql linux安装日志
  3. 透视MySQL数据库之更新语句
  4. SQL Server 查询分析器快捷键集合
  5. 专家谈SQL Server 2005 CLR
  6. SQL Server 2005 的安全性
  7. SQL Server 安全加固手册共享
  8. 实现自动安装SQL Server数据库
  9. SQL Server数据仓库的构建与分析
  10. java实现10个数的全排列的应用
  11. Java语言深入 文件和流
  12. 如何使用Java编写多线程程序
  13. Silverlight、JavaFX、Flex技术比
  14. Visual Basic Print方法基础学习
  15. VB+Access设计图书管理系统
  16. 巧妙调用系统功能 一键清除上网痕
  1. Mysql linux安装日志
  2. 透视MySQL数据库之更新语句
  3. SQL Server 查询分析器快捷键集合
  4. 用TRY/CATCH解决SQL2005的死锁
  5. 专家谈SQL Server 2005 CLR
  6. SQL Server 2005 的安全性
  7. SQL Server 安全加固手册共享
  8. 实现自动安装SQL Server数据库
  9. SQL Server SA权限总结经典技术
  10. SQL Server数据仓库的构建与分析
  11. java实现10个数的全排列的应用
  12. Java语言深入 文件和流
  13. XP中轻松获取未使用的IP地址
  14. 如何使用Java编写多线程程序
  15. Java服务器端编程安全必读
  16. Silverlight、JavaFX、Flex技术比
  1. Mysql linux安装日志
  2. 透视MySQL数据库之更新语句
  3. SQL Server 查询分析器快捷键集合
  4. 专家谈SQL Server 2005 CLR
  5. SQL Server 2005 的安全性
  6. SQL Server 安全加固手册共享
  7. 实现自动安装SQL Server数据库
  8. SQL Server数据仓库的构建与分析
  9. java实现10个数的全排列的应用
  10. Java语言深入 文件和流
  11. 用于挖掘Web日志的数据仓库系统实
  12. 如何使用Java编写多线程程序
  13. Silverlight、JavaFX、Flex技术比
  14. Visual Basic Print方法基础学习
  15. VB+Access设计图书管理系统
  16. 巧妙调用系统功能 一键清除上网痕

最近更新

  • 推荐阅读
  • Java《如何使用Java编写多线程程序》如何使用Java编写多线程程序
    关于我们 | 版权申明 | 广告服务 | 友情链接 | 网站地图 | 使用帮助 | ©2006-2008 TTADD.COM