浅析Java线程的三种实现

一、前言

java.lang.Thread类是java的线程类。当生成一个Thread类的对象后,一个新的线程就产生了。Java中每一个线程都是通过某个特定的Thread对象的方法run()来完成其操作的,方法run()称为线程体。

下面简单介绍Thread类的几种构造方法:

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只支持单重继承,用这种方法定义的类不能再继承其他父类。代码清单如下:

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的类仍然可以继承其他父类。代码清单如下:

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的一种改进,代码清单如下:

public class Demo3 implements Runnable{

private Thread myThread;
boolean isRunning = true;   //终止标记

public Demo2(){                  //构造函数
myThread =new Thread(new Runnable(){
<pre name="code" class="java">public void run(){          //方法体
while(isRunning){
try{
.
.
.
}catch(InterruptedException e){
e.printStackTrace();
}
}
}

});      //实例化对象
myThread.start();

}

public static void main(String[] args){

Demo2 demo2 =new Demo2();
}
}

说明:与方式2比较,我们发现Frame类不再实现Runnable接口了,而是在实例化Thread类的时候,定义了一个实现Runnable接口的匿名内部类。该方法在Android应用开发中经常采用。

时间: 2024-10-13 07:48:22

浅析Java线程的三种实现的相关文章

Java线程的三种命名方法

1.实例化一个线程对象 1 Thread t = new Thread(); 2 t.setName("甲"); 2.实例化一个线程对象的同时,通过构造方法对线程进行命名 1 Thread(Runnable r, String name) 2 Thread t = new Thread(() -> {}, "甲"); 3.使用自定义的线程类,在实例化线程对象的同时,进行名称的赋值 1 MyThread t = new MyThread("甲"

java创建线程的三种方式及其对比

Java中创建线程主要有三种方式: 一.继承Thread类创建线程类 (1)定义Thread类的子类,并重写该类的run方法,该run方法的方法体就代表了线程要完成的任务.因此把run()方法称为执行体. (2)创建Thread子类的实例,即创建了线程对象. (3)调用线程对象的start()方法来启动该线程. package com.thread; public class FirstThreadTest extends Thread{ int i = 0; //重写run方法,run方法的方

java中创建线程的三种方法以及区别

Java使用Thread类代表线程,所有的线程对象都必须是Thread类或其子类的实例.Java可以用三种方式来创建线程,如下所示: 1)继承Thread类创建线程 2)实现Runnable接口创建线程 3)使用Callable和Future创建线程 下面让我们分别来看看这三种创建线程的方法. ------------------------继承Thread类创建线程--------------------- 通过继承Thread类来创建并启动多线程的一般步骤如下 1]d定义Thread类的子类

【java】终止线程的三种方法

有三种方法可以使终止线程. 1.  使用退出标志,使线程正常退出,也就是当run方法完成后线程终止. 2.  使用stop方法强行终止线程(这个方法不推荐使用,因为stop和suspend.resume一样,也可能发生不可预料的结果). 3.  使用interrupt方法中断线程.     1. 使用退出标志终止线程 当run方法执行完后,线程就会退出.但有时run方法是永远不会结束的.如在服务端程序中使用线程进行监听客户端请求,或是其他的需要循环处理的任务.在这种情况下,一般是将这些任务放在一

java创建线程的三种方式及其对照

Java中创建线程主要有三种方式: 一.继承Thread类创建线程类 (1)定义Thread类的子类.并重写该类的run方法,该run方法的方法体就代表了线程要完毕的任务.因此把run()方法称为运行体. (2)创建Thread子类的实例,即创建了线程对象. (3)调用线程对象的start()方法来启动该线程. package com.thread; public class FirstThreadTest extends Thread{ int i = 0; //重写run方法.run方法的方

Java实现线程的三种方式和区别

Java实现线程的三种方式和区别 Java实现线程的三种方式: 继承Thread 实现Runnable接口 实现Callable接口 区别: 第一种方式继承Thread就不能继承其他类了,后面两种可以: 使用后两种方式可以多个线程共享一个target: Callable比Runnable多一个返回值,并且call()方法可以抛出异常: 访问线程名,第一种直接使用this.getName(),后两种使用Thread.currentThread().getName(). 下面我们通过代码来看一下实现

Java 线程第三版 第六章 高级同步议题 读书笔记

多线程数据同步错误比较难检测,因为通常是与事件的特定发生顺序有关. 一.同步术语 Barrier(屏障) barrier是多个Thread的集合点:所有的Thread都应该到齐在这个barrier之后才能允许它们继续下去. Condition variable(条件变量) 实际上不是变量,而是与某个lock有关联的变量. Event variable(事件变量) 条件变量的另一个名称. Critical section(临界区) 临界区是synchronized方法或者block. Lock(锁

Java 线程第三版 第八章 Thread与Collection Class 读书笔记

JDK1.2引入最有争议性的改变是将集合类默认为不是Thread安全性的. 一.Collection Class的概述 1. 具有Threadsafe 的Collection Class: java.util.Vector(List) 列表集合,通过索引操作. java.util.Stack(List) 继承自Vector,提供LIFO的顺序操作push进入,pop出元素. java.util.Hashtable(Map) 一个简单.无序的key与value的映射. java.util.conc

Java 线程第三版 第一章Thread导论、 第二章Thread的创建与管理读书笔记

第一章 Thread导论 为何要用Thread ? 非阻塞I/O I/O多路技术 轮询(polling) 信号 警告(Alarm)和定时器(Timer) 独立的任务(Task) 并行算法 第二章 Thread的创建与管理 一.什么是Thread ? Thread是所在主机执行的应用程序任务(task). 只有一个线程的例子: public class Factorial { public static void main(String[] args) { int n = 5; System.ou