Java编程那些事儿96——多线程使用示例1
陈跃峰
出自:http://blog.csdn.net/mailbomb
12.3 多线程使用示例
多线程技术对于初学者来说,是编程思维的一种跳跃,在实际学习时,一定要熟悉线程的基础知识,掌握线程的实现方式,然后就是开始大量的进行实践,从实践中领悟线程编程的奥妙以及实现的原理。
下面通过几个常见的例子演示多线程的基本使用。
12.3.1 定时
定时是在电影中常见的一种装置,在该部分就使用多线程技术模拟该功能。实现的功能为:在程序启动以后进行倒计时,当60秒以后程序结束,在程序运行时可以在控制台输入quit控制线程()的暂停。
在该示例程序中,开启了一个系统线程(main方法所在的线程),该线程的作用是启动模拟定时的线程,并且在控制台接受用户的输入,并判断输入的内容是否为quit,如果是则结束模拟定时的线程,程序结束。
首先来看一下使用继承Thread类的方式实现多线程时的代码示例,代码如下:
package example1;
import java.io.*;
/**
* 模拟定时线程
*/
public class TestTimeBomb1 {
public static void main(String[] args) {
//创建线程和启动线程
TimeBombThread tbt = new TimeBombThread();
//接受控制台输入
BufferedReader br = new BufferedReader(
new InputStreamReader(System.in));
String line;
try{
while(true){
System.out.println("输入quit结束线程:");
//获得控制台输入
line = br.readLine();
//判断是否是quit
if(line.equals("quit")){
tbt.stopThread(); //结束线程
break; //结束循环
}
}
}catch(Exception e){}
}
}
package example1;
/**
* 使用继承Thread类的方式模拟定时逻辑
*/
public class TimeBombThread extends Thread {
int n;
boolean isRun;
public TimeBombThread(){
n = 60;
isRun = true;
start();//启动线程
}
public void run(){
try{
while(isRun){
Thread.sleep(1000); //延迟1秒
System.out.println("剩余时间:" + n);
if(n <= 0){
isRun = false; //结束线程
System.out.println("爆炸!");
break;
}
n--; //时间减少1
}
}catch(Exception e){}
}
public void stopThread(){
isRun = false;
}
}
在该示例代码中,TestTimeBomb1类中包含的是系统线程,在系统线程中启动模拟定时的TimeBombThread线程,然后在TestTimeBomb1中接收用户的控制台输入,如果输入的内容是quit则结束线程,程序结束,否则忽略用户的输入,继续等待用户输入。按照前面介绍的IO知识,在接收控制台输入时readLine是阻塞方法,也就是该方法在未获得用户输入时会阻塞系统线程的执行,使系统线程进入到等待状态,等待用户输入。而TimeBombThread实现的逻辑是每隔1秒钟减少一次数值,并输出剩余时间,当剩余时间为零时,结束TimeBombThread线程。这样两个线程就同时工作了,系统线程等待用户输入的同时,模拟定时的线程继续执行,这样程序中就包含了两个同时执行的流程。
在这里需要特别说明的是,如何控制线程的结束?在本程序中,使用的是让线程自然死亡的方式,在实际控制线程时,当线程的run方法执行结束则线程自然死亡,所以在本程序中通过控制isRun变量使得线程可以自然结束,从而释放线程占用的资源。
同样的功能也可以使用Timer和TimerTask组合的方式实现,实现的代码如下所示:
package example1;
import java.io.*;
/**
* 模拟定时线程
*/
public class TestTimeBomb2 {
public static void main(String[] args) {
//创建线程和启动线程
TimeBombTimerTask tbtt = new TimeBombTimerTask();
//接受控制台输入
BufferedReader br = new BufferedReader(
new InputStreamReader(System.in));
String line;
try{
while(true){
System.out.println("输入quit结束线程:");
//获得控制台输入
line = br.readLine();
//判断是否是quit
if(line.equals("quit")){
tbtt.stopThread(); //结束线程
break; //结束循环
}
}
}catch(Exception e){}
}
}
package example1;
import java.util.*;
/**
* 使用Timer和TimerTask组合模拟定时
*/
public class TimeBombTimerTask extends TimerTask {
int n;
Timer t;
boolean isRun;
public TimeBombTimerTask(){
n = 60;
isRun = true;
t = new Timer();
t.schedule(this, 0); //启动线程
}
public void run() {
try{
while(isRun){
Thread.sleep(1000); //延迟1秒
System.out.println("剩余时间:" + n);
if(n <= 0){
stopThread(); //结束线程
System.out.println("爆炸!");
break; //结束循环
}
n--; //时间减少1
}
}catch(Exception e){}
}
public void stopThread(){
isRun = false;
t.cancel();
}
}
在该示例代码中,实现的原理和前面的类似,TestTimeBomb2类实现系统线程,功能是启动模拟定时的线程,并接收用户的控制台输入。而TimeBombTimerTask类实现模拟定时的线程,在该类内部包含启动线程的Timer对象,当构造该类的对象时,不仅完成该类的初始化,而且启动线程。
在控制Timer启动的线程结束时,首先结束当前的TimerTask线程,然后再调用Timer对象的cancel方法结束Timer对象的线程,这样才可以真正停止这种方式启动的线程。
至于使用实现Runnable方式实现线程的方式,和继承Thread类的实现几乎一致,读者可以根据第一种方式的实现独自进行实现,这里就不再重复实现了。
分享到:
相关推荐
【Java练手小项目——多线程...通过这个“Java练手小项目——多线程聊天室”,你可以深入了解Java多线程的原理和实践,同时学习到网络编程和并发集合的运用,这对于提升你的Java编程技能和解决实际问题的能力大有裨益。
java高级编程——对多线程,输入输出流,网络编程这三大块的深入讲解。
2. **利用多核处理器**:在多处理器系统中,使用多线程可以充分利用硬件资源,提高程序的执行效率。 3. **简化模型构建**:线程可以用来模拟现实世界中的并发事件,如模拟网络请求、数据库操作等,使得模型设计更加...
"Java多线程编程技术.pdf" Java多线程编程技术是Java平台的一个重要技术优势,是第一个直接把跨平台线程模型和标准的内存模型集成到语言中的主流语言。多线程编程技术是Java平台的一个重要技术优势,它可以使程序的...
本项目以"JAVA项目——多线程下载代码"为主题,使用Eclipse集成开发环境进行实现,适合于Java初学者或毕业设计实践。下面我们将深入探讨相关的Java多线程下载知识点。 1. **线程基础**:在Java中,线程是程序执行的...
Java 多线程编程应用场景 —— 电影院售票系统设计 本资源摘要信息将对 Java 多线程编程在电影院售票系统设计中的应用进行详细介绍。该系统模拟了电影院三个售票窗口同时出售电影票的过程,通过 Java 多线程编程...
Java多线程是Java编程中的重要概念,尤其在开发高性能、高并发的应用中不可或缺。本示例旨在为初学者提供一个全面理解Java多线程的起点。通过学习这个实例,你可以掌握如何创建和管理线程,理解线程同步与通信的重要...
本教程“Visual C++高级编程技术——MFC与多线程篇”将深入探讨这两个关键概念。 MFC是C++面向对象编程的一个重要框架,它基于Windows API,将复杂的Win32 API函数封装为易于理解和使用的类。MFC包含了一系列的类,...
在Java编程领域,多线程是一项至关重要的技术,它允许程序同时执行多个任务,从而提高系统资源的利用率和程序的响应速度。这份“JAVA多线程编程技术PDF”是学习和掌握这一领域的经典资料,涵盖了多线程的全部知识点...
标题"android——多线程"和描述"android——Handler与多线程应用范例"暗示我们将深入探讨如何在Android中使用Handler来管理多线程。 Android系统默认运行在一个单线程环境中,即主线程,也被称为UI线程。主线程主要...
《汪文君JAVA多线程编程实战》是一本专注于Java多线程编程的实战教程,由知名讲师汪文君倾力打造。这本书旨在帮助Java开发者深入理解和熟练掌握多线程编程技术,提升软件开发的效率和质量。在Java平台中,多线程是...
1. **线程创建**:在Java或其他支持多线程的编程语言中,创建线程的方式有多种,如Java中的`Thread`类或者`Runnable`接口。创建线程后,需要定义线程的执行逻辑,比如文件读取和写入的代码。 2. **文件读取**:在多...
易语言实例模块——多线程模块.e
并发编程——Java线程的6种状态及切换(csdn)————程序
这个名为"Java多线程的小例子——吃包子"的示例,旨在帮助开发者直观地理解多线程的工作原理。下面我们将深入探讨该示例所涉及的核心知识点。 首先,多线程通常涉及到以下几个关键概念: 1. **线程(Thread)**:...
Java是一种广泛使用的面向对象的编程语言,其特性包括平台独立性、丰富的类库、强大的多线程支持和简单的语法。在这个项目中,我们能看到以下关键知识点: 1. **基本语法**:Java的基础语法包括变量声明、数据类型...
Java中的多线程有三种实现方式: 1.继承Thread类,重写run方法。Thread本质上也是一个实现了Runnable的实例,他代表一个线程的实例,并且启动线程的唯一方法就是通过Thread类的start方法。 2.实现Runnable接口,并...
Java 多线程-Socket 编程是指在 Java 语言中使用多线程技术来实现网络编程,特别是使用 Socket 编程来实现客户端和服务器端的通信。在 Java 中,多线程可以使用 Thread 类和 Runnable 接口来实现,而 Socket 编程则...