浅析Java线程的三种实现
2015-06-23 11:26
295 查看
本文主要是浅析Java线程的三种实现,更多Java技术知识,请登陆疯狂软件教育官网。加疯狂软件官方微信号:fkitorg,免费赢大奖,有机会赢得iOS培训课程一套。
一、前言
java.lang.Thread类是java的线程类。当生成一个Thread类的对象后,一个新的线程就产生了。Java中每一个线程都是通过某个特定的Thread对象的方法run()来完成其操作的,方法run()称为线程体。
下面简单介绍Thread类的几种构造方法:
[java]
public Thread()
public Thread(Runnable target)
public Thread(Runnable target,String name)
public Thread(String name)
参数 target 是一个实现Runnable 接口的实例,它的作用是实现线程体的run()方法。目标 target 可为null,表示有本身实例来执行程序。name参数指定线程名字,如果没有指定则由JVM虚拟机自动分配,如thread-1、thread-2等名字。
在Java中有两种方法实现线程体:一是继承线程类Thread,二是实现接口Runnable
二、实现方式1
继承线程类Thread并重写其中的方法run(),初始化这个类实例的时候,目标target为null,表示由本实例来执行线程体。缺点:由于Java只支持单重继承,用这种方法定义的类不能再继承其他父类。代码清单如下:
[java]
public class Demo1 extends Thread{
boolean isRunning = true; //终止标记
public void run(){ //方法体
while(isRunning){
try{
}catch(InterruptedException e){
e.printStackTrace();
}
}
}
public static void main(String[] args){
demo1 =new Demo1(); //实例化对象
demo1.start();
}
}
说明:在main主方法中通过 new Demo1()创建子线程,并通过demo1.start()启动子线程。main主方法所在线程为主线程,主线程负责管理其他子线程。为了能够使线程停止,在主线程中增加一个标识,通过改变该标识 demo1.isRunning =false,从而结束这个线程。
二、实现方式2
提供一个实例接口Runnable的类作为一个线程的目标对象,在构造Thread类时把目标对象(实现Runnable的类)传递给这个线程实例,有该目标对象(实现Runnable的类)提供线程run()的方法。优点:这个时候实现接口Runnable的类仍然可以继承其他父类。代码清单如下:
[java]
public class Demo2 implements Runnable{
private Thread myThread;
boolean isRunning = true; //终止标记
public void run(){ //方法体
while(isRunning){
try{
}catch(InterruptedException e){
e.printStackTrace();
}
}
}
public Demo2(){ //构造函数
myThread =new Thread(this); //实例化对象
myThread.start();
}
public static void main(String[] args){
Demo2 demo2 =new Demo2();
}}
说明:首先创建一个Thread成员变量myThread,然后用构造方法new Thread(this)创建一个线程对象,其中创建线程使用的构造方法是Thread(Runnable target),其中的this代表本实例,它是一个实现了Runnable接口的实现类。
三、实现方式3
方法3是对方法2的一种改进,代码清单如下:
[java]
public class Demo3 implements Runnable{
private Thread myThread;
boolean isRunning = true; //终止标记
public Demo3(){ //构造函数
myThread =new Thread(new Runnable(){
public void run(){ //方法体
while(isRunning){
try{
}catch(InterruptedException e){
e.printStackTrace();
}
}
}
});
myThread.start();
}
public static void main(String[] args){
Demo3 demo3 =new Demo3();
}
}
说明:与方式2比较,我们发现Frame类不再实现Runnable接口了,而是在实例化Thread类的时候,定义了一个实现Runnable接口的匿名内部类。该方法在Android应用开发中经常采用。
三、总结
看完方式2和方式3后,可能会有些糊涂,这里有必要重新阐述一下它们的区别:方式3采用Thread(Runnable target)构造方法创建一个线程,需要提供一个Runnable接口对象,需要提供的参数是实现了Runnable接口的匿名内部类对象。方式2采用Thread()构造方法创建一个线程,新建一个Thread类,同时重新run()方法。
相关文章推荐
- 使用C++实现JNI接口需要注意的事项
- XP下使用虚拟机安装配置Solaris[多图]
- VirtualBox虚拟机XP与宿主机Ubuntu互访共享文件夹
- Linux下三大免费桌面虚拟机评测
- Ruby 之 class 中的 private、 protected、public
- mysql 中存在null和空时创建唯一索引的方法
- C#中string.Empty和null的区别详解
- 基于不要返回null之EmptyFactory的应用详解
- 详解MySQL中的NULL值
- asp提示无效使用 Null: Replace
- 详解链接的rel与target区别
- sql 语句中的 NULL值
- android 使用虚拟机安装apk(图文教程)
- Ruby中的public、private、protected区别小结
- JavaScript中为什么null==0为false而null大于=0为true(个人研究)
- JavaScript的null和undefined区别示例介绍
- JavaScript Undefined,Null类型和NaN值区别
- JS中判断null、undefined与NaN的方法
- MS Server和Oracle中对NULL处理的一些细节差异
- 解析C语言中空指针、空指针常量、NULL & 0的详解