java创建线程的两种方法区别

作者:kma 时间:2023-11-11 09:17:52 

在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,创建线程
0
投稿

猜你喜欢

  • 使用@ConfigurationProperties实现类型安全的配置过程

    2023-07-01 00:26:05
  • C#实现计算年龄的简单方法汇总

    2022-12-26 01:12:41
  • Android adb logcat 命令查看日志详细介绍

    2022-10-28 07:42:44
  • 教你如何监控 Java 线程池运行状态的操作(必看)

    2023-02-09 04:34:13
  • Java打印出所有的水仙花数的实现代码

    2023-03-06 17:24:22
  • Java Controller实现参数验证与统一异常处理流程详细讲解

    2022-01-25 18:49:47
  • Android 使用ViewPager实现左右循环滑动及轮播效果

    2022-10-28 15:23:21
  • 你知道jdk竟有4个random吗

    2022-06-14 23:37:08
  • Android的Service应用程序组件基本编写方法

    2023-12-17 04:22:00
  • Spring不能注入Static变量的原因及Spring注入静态变量

    2023-11-24 04:16:36
  • 详解基于spring多数据源动态调用及其事务处理

    2023-06-23 14:37:25
  • Java 如何优雅的抛出业务异常

    2023-11-24 04:04:34
  • Android 实例开发基于ArcSoft实现人脸识别

    2022-01-01 16:34:06
  • Spring AOP的概念与实现过程详解

    2023-02-17 02:54:12
  • Android入门教程之Fragment的具体使用详解

    2021-09-30 01:21:57
  • Java移动文件夹及其所有子文件与子文件夹

    2023-08-01 09:53:38
  • 浅谈Java的虚拟机结构以及虚拟机内存的优化

    2021-12-01 21:59:49
  • 一次Jvm old过高的排查过程实战记录

    2023-05-07 23:33:49
  • Java验证时间格式是否正确方法类项目实战

    2021-05-30 02:15:15
  • java处理图片背景颜色的方法

    2023-11-27 04:38:20
  • asp之家 软件编程 m.aspxhome.com