Java多线程编程需要我们不断的进行相关问题的学习下面我们就看看如何才能更好的进行相关知识的学习Java Thread API允许程序员编写具有多处理机制优点的应用程序在后台处理任务的同时保持用户所需的交互感
Alex Roetter介绍了Java Thread API并概述Java多线程编程可能引起的问题以及常见问题的解决方案
几乎所有使用AWT或Swing编写的画图程序都需要多Java多线程编程但多线程程序会造成许多困难刚开始编程的开发者常常会发现他们被一些问题所折磨例如不正确的程序行为或死锁
在本文中我们将探讨使用多线程时遇到的问题并提出那些常见陷阱的解决方案
Java多线程编程是什么?
一个程序或进程能够包含多个线程这些线程可以根据程序的代码执行相应的指令Java多线程编程看上去似乎在并行执行它们各自的工作就像在一台计算机上运行着多个处理机一样在多处理机计算机上实现多线程时它们确实可以并行工作和进程不同的是线程共享地址空间也就是说多个线程能够读写相同的变量或数据结构
编写多Java多线程编程程序时你必须注意每个线程是否干扰了其他线程的工作可以将程序看作一个办公室如果不需要共享办公室资源或与其他人交流所有职员就会独立并行地工作某个职员若要和其他人交谈当且仅当该职员在听且他们两说同样的语言此外只有在复印机空闲且处于可用状态(没有仅完成一半的复印工作没有纸张阻塞等问题)时职员才能够使用它在这篇文章中你将看到在 Java 程序中互相协作的线程就好像是在一个组织良好的机构中工作的职员
在Java多线程编程程序中线程可以从准备就绪队列中得到并在可获得的系统CPU上运行操作系统可以将线程从处理器移到准备就绪队列或阻塞队列中这种情况可以认为是处理器挂起了该线程同样Java 虚拟机 (JVM) 也可以控制线程的移动——在协作或抢先模型中——从准备就绪队列中将进程移到处理器中于是该线程就可以开始执行它的程序代码
协作式线程模型允许线程自己决定什么时候放弃处理器来等待其他的线程程序开发员可以精确地决定某个线程何时会被其他线程挂起允许它们与对方有效地合作缺点在于某些恶意或是写得不好的线程会消耗所有可获得的CPU时间导致其他线程饑饿
在抢占式线程模型中操作系统可以在任何时候打断线程通常会在它运行了一段时间(就是所谓的一个时间片)后才打断它这样的结果自然是没有线程能够不公平地长时间霸占处理器然而随时可能打断线程就会给程序开发员带来其他麻烦同样使用办公室的例子假设某个职员抢在另一人前使用复印机但打印工作在未完成的时候离开了另一人接着使用复印机时该复印机上可能就还有先前那名职员留下来的资料抢占式Java多线程编程模型要求线程正确共享资源协作式模型却要求线程共享执行时间由于 JVM 规范并没有特别规定线程模型Java 开发员必须编写可在两种模型上正确运行的程序在了解线程以及线程间通讯的一些方面之后我们可以看到如何为这两种模型设计程序
线程和Java语言
为了使用Java语言创建线程你可以生成一个Thread类(或其子类)的对象并给这个对象发送start() 消息(程序可以向任何一个派生自Runnable接口的类对象发送start()消息)每个线程动作的定义包含在该Java多线程编程对象的run()方法中run方法就相当于传统程序中的main()方法线程会持续运行直到run()返回为止此时该线程便死了