一、前言

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 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()方法。

浅析Java线程的三种实现相关推荐

  1. java 创建线程_【80期】说出Java创建线程的三种方式及对比

    点击上方"Java面试题精选",关注公众号 面试刷图,查缺补漏 >>号外:往期面试题,10篇为一个单位归置到本公众号菜单栏->面试题,有需要的欢迎翻阅. 一.Ja ...

  2. Java 创建线程的三种方式

    一.继承Thread类创建 1.定义一个类继承Thread类,并重写Thread类的run()方法,run()方法的方法体就是线程要完成的任务,因此把run()称为线程的执行体: 2.创建该类的实例对 ...

  3. Java创建线程的三种方式

    一.继承Thread类创建线程类 (1)定义Thread类的子类,并重写该类的run方法,该run方法的方法体就代表了线程要完成的任务.因此把run()方法称为执行体. (2)创建Thread子类的实 ...

  4. java 终止方法_Java中终止线程的三种方法

    Java中终止线程的三种方法 Thread.stop, Thread.suspend, Thread.resume 和Runtime.runFinalizersOnExit 这些终止线程运行的方法已经 ...

  5. Java创建线程的三种方法

    这里不会贴代码,只是将创建线程的三种方法做个笼统的介绍,再根据源码添加上自己的分析. 通过三种方法可以创建java线程: 1.继承Thread类. 2.实现Runnable接口. 3.实现Callab ...

  6. Java 创建线程的三种方法比较

    在学习编程的过程中,我觉得不止要获得课本的知识,更多的是通过学习技术知识提高解决问题的能力,这样我们才能走在最前方,本文主要讲述Java 创建线程的三种方法比较, 更多Java专业知识,广州疯狂jav ...

  7. Java 创建一个线程的三种方式

    Java 创建一个线程的三种方式 更多内容,点击了解: https://how2j.cn/k/thread/thread-start/353.html 创建多线程有3种方式,分别是继承线程类,实现Ru ...

  8. java 多线程编程(包括创建线程的三种方式、线程的生命周期、线程的调度策略、线程同步、线程通信、线程池、死锁等)

    1 多线程的基础知识 1.1 单核CPU和多核CPU 单核CPU,其实是一种假的多线程,因为在一个时间单元内,也只能执行一个线程的任务.微观上这些程序是分时的交替运行,只不过是给人的感觉是同时运行,那 ...

  9. java如何实现线程_java中线程的三种实现方式

    packagecom.four.day01;importjava.util.concurrent.Callable;importjava.util.concurrent.ExecutionExcept ...

最新文章

  1. 《代码敲不队》第五次作业:项目需求分析改进与系统设计
  2. 组合自定义控件的步骤详解
  3. 缓存系列之二:CDN与其他层面缓存
  4. 类型全部为string_TypeScript 高级类型总结(含代码案例)
  5. World Wind Java开发之十二——加载粗制三维模型(ExtrudedPolygon)(转)
  6. 使用OpenCV进行图片模糊处理(归一化滤波器)
  7. MySQL定时备份数据库(全库备份)
  8. 扩展欧几里德算法 C# 实现
  9. Python 数据挖掘 | 第3章 使用 Pandas 数据分析
  10. 纯CSS3绘制26个英文字母
  11. C语言编写走迷宫小游戏
  12. 声声慢 - 程序人生(程序员生活的真实写照)
  13. 敏捷仪式感之:敏捷宣传栏
  14. 【电子产品】ThinkPad S5 Intel R Dual Band Wireless-AC 3165 网卡驱动莫名
  15. python打卡以及Linux自动运行python文件
  16. Java计算1+2+...+n
  17. 如何设置WordPress文章特色图像(Featured Image)
  18. 判断三个老师教哪门课命题c语言,教师招聘考试真题7-2013年郑州市高新区
  19. carthage命令
  20. reactnative打包apk报错:failed parsing overlays.

热门文章

  1. Spark Streaming 作者,Alluxio 的创始人李浩源:AI 潮流对做数据存储业务公司的挑战...
  2. 在Winform中播放视频等【DotNet,C#】
  3. docker-compose 报错记录
  4. 仔细讨论 C/C++ 字节对齐问题⭐⭐
  5. 《Oracle达人修炼秘籍:Oracle 11g数据库管理与开发指南 》一3.6 卸载Oracle 11g产品...
  6. HDU 1724 Ellipse ——Simpson积分
  7. Linux系统编程之--守护进程的创建和详解【转】
  8. 2. 两数相加(中等)
  9. 华清远见java考试题_Java面试题,你能答对几个?
  10. 第六次的服务端课程:JDBC,数据源配置