java创建线程的两种方法区别
作者:kma 发布时间:2023-11-11 09:17:52
标签:java,创建线程
在Java中创建一个线程有两种方法:继承Thread类和实现Runnable接口。
下面通过两个例子来分析两者的区别:
1)继承Thread类
public class TestThread extends Thread {
int count = 3;
public TestThread(String ThreadName) {
super(ThreadName);
}
@Override
public void run() {
for (int i = 0; i < 10; i++)
if (count > 0) {
System.out.println(Thread.currentThread().getName() + "--->" + count);
count--;
}
}
public static void main(String[] args) {
//new三个线程并启动
new TestThread("线程一").start();
new TestThread("线程二").start();
new TestThread("线程三").start();
}
}
输出结果:
线程一--->3
线程一--->2
线程一--->1
线程二--->3
线程二--->2
线程二--->1
线程三--->3
线程三--->2
线程三--->1
2)实现Runnable接口
同样跟继承Thread的代码:
public class TestThread implements Runnable {
int count = 3;
public TestThread() {
}
@Override
public void run() {
for (int i = 0; i < 10; i++)
if (count > 0) {
System.out.println(Thread.currentThread().getName() + "--->" + count);
count--;
}
}
public static void main(String[] args) {
TestThread tr = new TestThread();
//new三个线程并启动同一个Runnable
new Thread(tr, "线程一").start();
new Thread(tr, "线程二").start();
new Thread(tr, "线程三").start();
}
}
输出结果:
线程一--->3
线程一--->2
线程一--->1
可以发现两种新建线程的方式最后的输出结果不一样,是因为在继承Thread类中,同时创建了三个线程,每个线程都执行一个任务,相当于三个线程分别各自进行三次循环打印log;而在第二种实现Runnable接口中是创建三个Thread共同去执行tr这个Runnable,相当于三个Thread共同去执行这一个循环,使得最后count只循环了一次,剩余线程二和线程三都因为使用同一个count导致未能打印出来。
结论:
1)两种创建线程的实现方式不一样,一个通过继承一个通过实现接口,在Java中如果已经继承了其他的父类,那么只能实现接口来创建线程。
2)通过上面的例子可以看到继承Thread,每个线程都独立拥有一个对象,而实现Runnable对象,多个线程共享一个Runnable实例。


猜你喜欢
- 本文实例为大家分享了java读取cvs文件并导入数据库的具体代码,供大家参考,具体内容如下首先获取文件夹下面的所有类型相同的excel,可以
- 前言本文介绍了Object类以及Object类部分方法,toString方法,equals和hashCode方法(重写前和重写后的对比),g
- 如果有人对程序的崩溃原因做下统计的话,那么由于对象为空,但是又访问了对象的某个属性而导致的崩溃,也许会是程序崩溃的第一大原因了。比如我们在使
- 一、场景笔者就Zuul网关下实现其负载均衡与熔断机制(雪崩)进行实践,前提是已经导入zuul相关依赖springboot版本:1.5.9.R
- volatile关键字关于先说它的两个作用:保证变量在内存中对线程的可见性禁用指令重排每个字都认识,凑在一起就麻了这两个作用通常很不容易被我
- 1、未配置之前2、开始配置 2.1 新建一个unauth.html<!DOCTYPE html><html la
- 已知字符串“aabbbcddddeeffffghijklmnopqrst”编程找出出现最多的字符和次数,要求时间复杂度小于O(n^2)/**
- 目录前言错误实例演示实现ApplicationContextAware接口lookup methodlookup method签名总结前言看
- 前言我们在日常的开发过程中针对一些字段采用整型的方式去代替某些具体的含义,比如性别0代表男,1代表女。如果只是一些不会变更的转译我们可以采用
- 本文实例为大家分享了Android实现图像切换器的具体代码,供大家参考,具体内容如下java代码:private int[] imageId
- 归并排序简单解释:该算法是采用分治法,把数组不断分割,直至成为单个元素,然后比较再合并(合并的过程就是两部分分别从头开始比较,取出最小或最大
- 前言:朋友们开始以下教程前,请先看第五大点的注意事项,以避免不必要的重复操作。 一、准备工作(以下为本实例使用工具)1、MyEcl
- 废话不多说了,下面代码给大家介绍下利用正则表达式判断字符的方法,具体代码如下所示:using System;using System.Tex
- 我自己在使用的过程中遇见的问题,百度找了很久才找到合适的方法。报错如下:Emulator: emulator: ERROR: Unknown
- 本文以实例形式讲述了C#解析JSON的方法,C#封装了对XML和JSON解析的类库,使用相当方便!具体用法如下:1.主要用到的类:主要用到了
- Java把内存分成两种,一种叫做栈内存,一种叫做堆内存在函数中定义的一些基本类型的变量和对象的引用变量都是在函数的栈内存中分配。
- 一、基本概念C#只有两种数据类型:值类型和引用类型值类型在线程栈分配空间,引用类型在托管堆分配空间值类型转为引用类型称成为装箱,引用类型转为
- unity3d发布apk在android虚拟机中运行的详细步骤(unity3d导出android apk),总的流程分为以下6个步骤:1、安
- 本文介绍了Android EasyBarrage实现轻量级弹幕效果,分享给大家,具体如下:概述EasyBarrage是Android平台的一
- 本文实例为大家分享了Android仿刮刮卡效果展示的具体代码,供大家参考,具体内容如下一、Xfermode 通过使用Xfermode将绘制的