专注于互联网--专注于架构

最新标签
网站地图
文章索引
Rss订阅

首页 »Java教程 » java多线程应用:编写多线程Java应用程序常见问题 »正文

java多线程应用:编写多线程Java应用程序常见问题

来源: 发布时间:星期三, 2008年12月17日 浏览:2次 评论:0
        几乎所有使用 AWT 或 Swing 编写画图都需要多线程但多线程会造成许多困难刚开始编程开发者常常会发现他们被些问题所折磨例如不正确行为或死锁

        在本文中我们将探讨使用多线程时遇到问题并提出那些常见陷阱解决方案

        线程是什么?

        或进程能够包含多个线程这些线程可以根据代码执行相应指令多线程看上去似乎在并行执行它们各自工作就像在台计算机上运行着多个处理机在多处理机计算机上实现多线程时它们确实可以并行工作和进程区别线程共享地址空间也就是说多个线程能够读写相同变量或数据结构

        编写多线程你必须注意每个线程是否干扰了其他线程工作可以将看作个办公室如果不需要共享办公室资源或和其他人交流所有职员就会独立并行地工作某个职员若要和其他人交谈当且仅当该职员在“听”且他们两说同样语言此外只有在复印机空闲且处于可用状态(没有仅完成复印工作没有纸张阻塞等问题)时职员才能够使用它在这篇文章中你将看到在 Java 中互相协作线程就好像是在个组织良好机构中工作职员

        在多线程线程可以从准备就绪队列中得到并在可获得系统 CPU 上运行操作系统可以将线程从处理器移到准备就绪队列或阻塞队列中这种情况可以认为是处理器“挂起”了该线程同样Java 虚拟机 (JVM) 也可以控制线程移动在协作或抢先模型中从准备就绪队列中将进程移到处理器中于是该线程就可以开始执行它代码

        协作式线程模型允许线程自己决定什么时候放弃处理器来等待其他线程开发员可以精确地决定某个线程何时会被其他线程挂起允许它们和对方有效地合作缺点在于某些恶意或是写得不好线程会消耗所有可获得 CPU 时间导致其他线程“饥饿”

        在抢占式线程模型中操作系统可以在任何时候打断线程通常会在它运行了段时间(就是所谓个时间片)后才打断它这样结果自然是没有线程能够不公平地长时间霸占处理器然而随时可能打断线程就会给开发员带来其他麻烦同样使用办公室例子假设某个职员抢在另人前使用复印机但打印工作在未完成时候离开了人接着使用复印机时该复印机上可能就还有先前那名职员留下来资料抢占式线程模型要求线程正确共享资源协作式模型却要求线程共享执行时间由于 JVM 规范标准并没有特别规定线程模型Java 开发员必须编写可在两种模型上正确运行在了解线程以及线程间通讯些方面的后我们可以看到如何为这两种模型设计

        线程和 Java 语言

        为了使用 Java 语言创建线程你可以生成个 Thread 类(或其子类)对象并给这个对象发送 start 消息(可以向任何个派生自 Runnable 接口类对象发送 start 消息)每个线程动作定义包含在该线程对象 run 思路方法中run 思路方法就相当于传统 思路方法;线程会持续运行直到 run 返回为止此时该线程便死了

        上 锁

        大多数应用要求线程互相通信来同步它们动作在 Java 中最简单实现同步思路方法就是上锁为了防止同时访问共享资源线程在使用资源前后可以给该资源上锁和开锁假想给复印机上锁时刻只有个职员拥有钥匙若没有钥匙就不能使用复印机给共享变量上锁就使得 Java 线程能够快速方便地通信和同步某个线程若给个对象上了锁就可以知道没有其他线程能够访问该对象即使在抢占式模型中其他线程也不能够访问此对象直到上锁线程被唤醒、完成工作并开锁那些试图访问个上锁对象线程通常会进入睡眠状态直到上锁线程开锁旦锁被打开这些睡眠进程就会被唤醒并移到准备就绪队列中

        在 Java 编程中所有对象都有锁线程可以使用 synchronized 关键字来获得锁在任时刻对于给定例子思路方法或同步代码块只能被个线程执行这是代码在执行的前要求获得对象继续我们有关复印机比喻为了避免复印冲突我们可以简单地对复印资源实行同步如同下列代码例子时刻只允许位职员使用复印资源通过使用思路方法(在 Copier 对象中)来修改复印机状态这个思路方法就是同步思路方法只有个线程能够执行个 Copier 对象中同步代码因此那些需要使用 Copier 对象职员就必须排队等候

CopyMachine {

public synchronized void makeCopies(Document d, nCopies) {
// _disibledevent="_blank">java线程

相关文章

读者评论

  • 共0条 分0页

发表评论

  • 昵称:
  • 内容: