浅析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 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线程的三种实现相关推荐
- java 创建线程_【80期】说出Java创建线程的三种方式及对比
点击上方"Java面试题精选",关注公众号 面试刷图,查缺补漏 >>号外:往期面试题,10篇为一个单位归置到本公众号菜单栏->面试题,有需要的欢迎翻阅. 一.Ja ...
- Java 创建线程的三种方式
一.继承Thread类创建 1.定义一个类继承Thread类,并重写Thread类的run()方法,run()方法的方法体就是线程要完成的任务,因此把run()称为线程的执行体: 2.创建该类的实例对 ...
- Java创建线程的三种方式
一.继承Thread类创建线程类 (1)定义Thread类的子类,并重写该类的run方法,该run方法的方法体就代表了线程要完成的任务.因此把run()方法称为执行体. (2)创建Thread子类的实 ...
- java 终止方法_Java中终止线程的三种方法
Java中终止线程的三种方法 Thread.stop, Thread.suspend, Thread.resume 和Runtime.runFinalizersOnExit 这些终止线程运行的方法已经 ...
- Java创建线程的三种方法
这里不会贴代码,只是将创建线程的三种方法做个笼统的介绍,再根据源码添加上自己的分析. 通过三种方法可以创建java线程: 1.继承Thread类. 2.实现Runnable接口. 3.实现Callab ...
- Java 创建线程的三种方法比较
在学习编程的过程中,我觉得不止要获得课本的知识,更多的是通过学习技术知识提高解决问题的能力,这样我们才能走在最前方,本文主要讲述Java 创建线程的三种方法比较, 更多Java专业知识,广州疯狂jav ...
- Java 创建一个线程的三种方式
Java 创建一个线程的三种方式 更多内容,点击了解: https://how2j.cn/k/thread/thread-start/353.html 创建多线程有3种方式,分别是继承线程类,实现Ru ...
- java 多线程编程(包括创建线程的三种方式、线程的生命周期、线程的调度策略、线程同步、线程通信、线程池、死锁等)
1 多线程的基础知识 1.1 单核CPU和多核CPU 单核CPU,其实是一种假的多线程,因为在一个时间单元内,也只能执行一个线程的任务.微观上这些程序是分时的交替运行,只不过是给人的感觉是同时运行,那 ...
- java如何实现线程_java中线程的三种实现方式
packagecom.four.day01;importjava.util.concurrent.Callable;importjava.util.concurrent.ExecutionExcept ...
最新文章
- 《代码敲不队》第五次作业:项目需求分析改进与系统设计
- 组合自定义控件的步骤详解
- 缓存系列之二:CDN与其他层面缓存
- 类型全部为string_TypeScript 高级类型总结(含代码案例)
- World Wind Java开发之十二——加载粗制三维模型(ExtrudedPolygon)(转)
- 使用OpenCV进行图片模糊处理(归一化滤波器)
- MySQL定时备份数据库(全库备份)
- 扩展欧几里德算法 C# 实现
- Python 数据挖掘 | 第3章 使用 Pandas 数据分析
- 纯CSS3绘制26个英文字母
- C语言编写走迷宫小游戏
- 声声慢 - 程序人生(程序员生活的真实写照)
- 敏捷仪式感之:敏捷宣传栏
- 【电子产品】ThinkPad S5 Intel R Dual Band Wireless-AC 3165 网卡驱动莫名
- python打卡以及Linux自动运行python文件
- Java计算1+2+...+n
- 如何设置WordPress文章特色图像(Featured Image)
- 判断三个老师教哪门课命题c语言,教师招聘考试真题7-2013年郑州市高新区
- carthage命令
- reactnative打包apk报错:failed parsing overlays.
热门文章
- Spark Streaming 作者,Alluxio 的创始人李浩源:AI 潮流对做数据存储业务公司的挑战...
- 在Winform中播放视频等【DotNet,C#】
- docker-compose 报错记录
- 仔细讨论 C/C++ 字节对齐问题⭐⭐
- 《Oracle达人修炼秘籍:Oracle 11g数据库管理与开发指南 》一3.6 卸载Oracle 11g产品...
- HDU 1724 Ellipse ——Simpson积分
- Linux系统编程之--守护进程的创建和详解【转】
- 2. 两数相加(中等)
- 华清远见java考试题_Java面试题,你能答对几个?
- 第六次的服务端课程:JDBC,数据源配置