多线程中基础Thread和实现Runnable的区别

本文涉及的产品
文本翻译,文本翻译 100万字符
文档翻译,文档翻译 1千页
图片翻译,图片翻译 100张
简介: 在程序开发中只要是多线程肯定永远以实现Runnable接口为主,因为实现Runnable接口相比继承Thread类有如下好处:避免点继承的局限,一个类可以继承多个接口。适合于资源的共享因为Java本来就是面向接口的,所以第一个特性应该很容易理解,下面我们以买票为例,通过Thread类完成要卖出30张票。虽然现在程序中有三个线程,但是一共卖了10张票,也就是说使用R

在程序开发中只要是多线程肯定永远以实现Runnable接口为主,因为实现Runnable接口相比继承Thread类有如下好处:

  • 避免点继承的局限,一个类可以继承多个接口。
  • 适合于资源的共享

因为Java本来就是面向接口的,所以第一个特性应该很容易理解,下面我们以买票为例,通过Thread类完成要卖出30张票。虽然现在程序中有三个线程,但是一共卖了10张票,也就是说使用Runnable实现多线程可以达到资源共享目的。

用继承Thread实现

MyThread.java

package testthreadandrunnable;

class MyThread extends Thread {

    private int ticket = 10;
    private String name;

    public MyThread(String name) {
        this.name = name;
    }

    public void run() {
        for (int i = 0; i < 500; i++) {
            if (this.ticket > 0) {
                System.out.println(this.name + "卖票---->" + (this.ticket--));
            }
        }
    }
}

Application.java

package testthreadandrunnable;

public class Application {

    public static void main(String[] args) {

        //继承Thread来实现多线程
        MyThread mt1= new MyThread("一号窗口");  
        MyThread mt2= new MyThread("二号窗口");  
        MyThread mt3= new MyThread("三号窗口");  
        mt1.start();  
        mt2.start();  
        mt3.start();

        //实现Runnable接口实现多线程
        /*MyThreadForRunnable mt = new MyThreadForRunnable();  
        Thread t1 = new Thread(mt,"一号窗口");  
        Thread t2 = new Thread(mt,"二号窗口");  
        Thread t3 = new Thread(mt,"三号窗口");  

        t1.start();  
        t2.start();  
        t3.start();  */
    }
}

这里写图片描述

实现Runnable接口

MyThreadForRunnable.java

package testthreadandrunnable;

public class MyThreadForRunnable implements Runnable {
    private int ticket = 10;
    private boolean flag = true;

    public void run() {
        while (flag) {
            if (this.ticket > 0) {
                System.out.println(Thread.currentThread().getName() + "卖票---->"
                        + (this.ticket--));
            } else {
                flag = false;
            }
        }
    }
}

Application.java

package testthreadandrunnable;

public class Application {

    public static void main(String[] args) {

        //继承Thread来实现多线程
        /*MyThread mt1= new MyThread("一号窗口");  
        MyThread mt2= new MyThread("二号窗口");  
        MyThread mt3= new MyThread("三号窗口");  
        mt1.start();  
        mt2.start();  
        mt3.start();*/

        //实现Runnable接口实现多线程
        MyThreadForRunnable mt = new MyThreadForRunnable();  
        Thread t1 = new Thread(mt,"一号窗口");  
        Thread t2 = new Thread(mt,"二号窗口");  
        Thread t3 = new Thread(mt,"三号窗口");  

        t1.start();  
        t2.start();  
        t3.start();  
    }
}

这里写图片描述

很容易发现问题,如果用Runnable可以很容易实现数据共享。

注意一点,结束线程

其实细心一点分析一下,就能看到,两个run里面的我故意用了不同的方式结束线程,其实第一种for循环不是特别好,500,那剩下的都浪费了,但是第二种设置一个flag的方式就不会出现浪费。

这里写图片描述

有三种方法可以使终止线程。

  1. 使用退出标志,使线程正常退出,也就是当run方法完成后线程终止。

  2. 使用stop方法强行终止线程(这个方法不推荐使用,因为stop和suspend、resume一样,也可能发生不可预料的结果)。

  3. 使用interrupt方法中断线程。
目录
相关文章
|
14天前
|
Java 程序员 调度
【JavaEE】线程创建和终止,Thread类方法,变量捕获(7000字长文)
创建线程的五种方式,Thread常见方法(守护进程.setDaemon() ,isAlive),start和run方法的区别,如何提前终止一个线程,标志位,isinterrupted,变量捕获
|
14天前
|
安全 Java API
【JavaEE】多线程编程引入——认识Thread类
Thread类,Thread中的run方法,在编程中怎么调度多线程
|
2月前
|
Java C# Python
线程等待(Thread Sleep)
线程等待是多线程编程中的一种同步机制,通过暂停当前线程的执行,让出CPU时间给其他线程。常用于需要程序暂停或等待其他线程完成操作的场景。不同语言中实现方式各异,如Java的`Thread.sleep(1000)`、C#的`Thread.Sleep(1000)`和Python的`time.sleep(1)`。使用时需注意避免死锁,并考虑其对程序响应性的影响。
|
2月前
|
安全 Java
在 Java 中使用实现 Runnable 接口的方式创建线程
【10月更文挑战第22天】通过以上内容的介绍,相信你已经对在 Java 中如何使用实现 Runnable 接口的方式创建线程有了更深入的了解。在实际应用中,需要根据具体的需求和场景,合理选择线程创建方式,并注意线程安全、同步、通信等相关问题,以确保程序的正确性和稳定性。
149 11
|
3月前
|
Java
在Java多线程编程中,实现Runnable接口通常优于继承Thread类
【10月更文挑战第20天】在Java多线程编程中,实现Runnable接口通常优于继承Thread类。原因包括:1) Java只支持单继承,实现接口不受此限制;2) Runnable接口便于代码复用和线程池管理;3) 分离任务与线程,提高灵活性。因此,实现Runnable接口是更佳选择。
71 2
|
3月前
|
Java
Java中多线程编程的基本概念和创建线程的两种主要方式:继承Thread类和实现Runnable接口
【10月更文挑战第20天】《JAVA多线程深度解析:线程的创建之路》介绍了Java中多线程编程的基本概念和创建线程的两种主要方式:继承Thread类和实现Runnable接口。文章详细讲解了每种方式的实现方法、优缺点及适用场景,帮助读者更好地理解和掌握多线程编程技术,为复杂任务的高效处理奠定基础。
45 2
|
2月前
|
Java
为什么一般采用实现Runnable接口创建线程?
因为使用实现Runnable接口的同时我们也能够继承其他类,并且可以拥有多个实现类,那么我们在拥有了Runable方法的同时也可以使用父类的方法;而在Java中,一个类只能继承一个父类,那么在继承了Thread类后我们就不能再继承其他类了。
29 0
|
16天前
|
NoSQL Redis
单线程传奇Redis,为何引入多线程?
Redis 4.0 引入多线程支持,主要用于后台对象删除、处理阻塞命令和网络 I/O 等操作,以提高并发性和性能。尽管如此,Redis 仍保留单线程执行模型处理客户端请求,确保高效性和简单性。多线程仅用于优化后台任务,如异步删除过期对象和分担读写操作,从而提升整体性能。
46 1
|
3月前
|
存储 消息中间件 资源调度
C++ 多线程之初识多线程
这篇文章介绍了C++多线程的基本概念,包括进程和线程的定义、并发的实现方式,以及如何在C++中创建和管理线程,包括使用`std::thread`库、线程的join和detach方法,并通过示例代码展示了如何创建和使用多线程。
65 1
|
3月前
|
Java 开发者
在Java多线程编程中,创建线程的方法有两种:继承Thread类和实现Runnable接口
【10月更文挑战第20天】在Java多线程编程中,创建线程的方法有两种:继承Thread类和实现Runnable接口。本文揭示了这两种方式的微妙差异和潜在陷阱,帮助你更好地理解和选择适合项目需求的线程创建方式。
46 3