Thread和Runnable实现多线程(一)下

简介: Thread和Runnable实现多线程(一)

三. Thread 和 Runnable 的区别


实现多线程, 必须要调用 Thread 类的 start() 方法。


继承 Thread 类时, 由于 MyThreadDemo 类继承了父类 Thread ,所以在实例化 MyThreadDemo 对象之后,可以直接调用 start()方法,一步即可。


而实现 Thread 接口时, 当实例化 MyRunnableDemo 对象之后,必须将这个对象放置到 Thread 类对象之后,才能调用 start() 方法,需要两步。


三.一 关于共享资源时的区别


三.一.一 Thread 资源


 class MyThreadDemo2 extends Thread{
        //总共五张票
        private int ticket=5;
        @Override
        public void run() {
            for(int i=0;i<10;i++){
                if(ticket>0){
                    System.out.println("还剩下:"+ticket+"张票");
                    ticket--;
                }
            }
        }
    }
    //验证是否共享变量值
    @Test
    public void runTest4(){
        //实例化多个, 两个类 thread1,thread2 中的属性值是不共享的。 
        MyThreadDemo2 thread1=new MyThreadDemo2();
        MyThreadDemo2 thread2=new MyThreadDemo2();
        thread1.start();
        thread2.start();
    }


运行程序,控制台打印输出:


20200619095653369.png


运行程序,控制台打印输出:


三.一.二 Runnable 接口时资源


class MyRunnableDemo2 implements Runnable{
        private int ticket=5;
        @Override
        public void run() {
            for(int i=0;i<10;i++){
                if(ticket>0){
                    System.out.println("还剩下:"+ticket+"张票");
                    ticket--;
                }
            }
        }
    }
    @Test
    public void test4(){
        //只实例化一次
        MyRunnableDemo2 myRunnableDemo1=new MyRunnableDemo2();
        //被两个线程共享
        Thread thread1=new Thread(myRunnableDemo1);
        Thread thread2=new Thread(myRunnableDemo1);
        //启动
        thread1.start();
        thread2.start();
    }


运行程序,查看控制台:


20200619095659134.png


共卖出了5 张票。 (最后面有个5是因为有延迟,导致 第二个线程开启时 5>0,判断进去了。 后面加入同步,就可以解决这个问题)


注意,这个时候,如果将 MyRunnableDemo2 对象实例化两次, 那么 这个属性 就不会被共享了。


    @Test
    public void test3(){
        //实例化两次
        MyRunnableDemo2 myRunnableDemo1=new MyRunnableDemo2();
        MyRunnableDemo2 myRunnableDemo2=new MyRunnableDemo2();
        Thread thread1=new Thread(myRunnableDemo1);
        Thread thread2=new Thread(myRunnableDemo2);
        //启动
        thread1.start();
        thread2.start();
    }


20200619095706340.png


所以,一般都是只实例化一次 Runnable 对象即可。


三.二 Runnable 接口的优点


开发中,一般都使用 Runnable 接口的方式实现多线程。


有以下优点:


1.适合多个相同的程序代码的线程去处理同一个资源


2.可以避免java中的单继承的限制


3.增加程序的健壮性,代码可以被多个线程共享,代码和数据独立


4.线程池只能放入实现Runable或callable类线程,不能直接放入继承Thread的类


四. 多线程写法简化


四.一 第一种方式


    @Test
    public void test1() throws Exception{
       Thread thread= new Thread(new Runnable() {
            @Override
            public void run() {
                for(int i=0;i<10;i++){
                    System.out.println("输出i:"+i);
                }
            }
        });
       thread.start();
    }


四.二 第二种方式


  @Test
    public void test2() throws Exception{
        new Thread(new Runnable() {
            @Override
            public void run() {
                for(int i=0;i<10;i++){
                    System.out.println("输出i:"+i);
                }
            }
        }).start();
    }


四.三 第三种方式


@Test
    public void test3() throws Exception{
        //lamba 表达式
        new Thread(()->{
            for(int i=0;i<10;i++){
                System.out.println("输出i:"+i);
            }
        }).start();
    }


谢谢您的观看,如果喜欢,请关注我,再次感谢 !!!

相关文章
|
23天前
|
Java C# Python
线程等待(Thread Sleep)
线程等待是多线程编程中的一种同步机制,通过暂停当前线程的执行,让出CPU时间给其他线程。常用于需要程序暂停或等待其他线程完成操作的场景。不同语言中实现方式各异,如Java的`Thread.sleep(1000)`、C#的`Thread.Sleep(1000)`和Python的`time.sleep(1)`。使用时需注意避免死锁,并考虑其对程序响应性的影响。
|
1月前
|
安全 Java
在 Java 中使用实现 Runnable 接口的方式创建线程
【10月更文挑战第22天】通过以上内容的介绍,相信你已经对在 Java 中如何使用实现 Runnable 接口的方式创建线程有了更深入的了解。在实际应用中,需要根据具体的需求和场景,合理选择线程创建方式,并注意线程安全、同步、通信等相关问题,以确保程序的正确性和稳定性。
104 11
|
2月前
|
Java 开发者
在Java多线程编程中,创建线程的方法有两种:继承Thread类和实现Runnable接口
【10月更文挑战第20天】在Java多线程编程中,创建线程的方法有两种:继承Thread类和实现Runnable接口。本文揭示了这两种方式的微妙差异和潜在陷阱,帮助你更好地理解和选择适合项目需求的线程创建方式。
27 3
|
2月前
|
Java
在Java多线程编程中,实现Runnable接口通常优于继承Thread类
【10月更文挑战第20天】在Java多线程编程中,实现Runnable接口通常优于继承Thread类。原因包括:1) Java只支持单继承,实现接口不受此限制;2) Runnable接口便于代码复用和线程池管理;3) 分离任务与线程,提高灵活性。因此,实现Runnable接口是更佳选择。
51 2
|
2月前
|
Java
Java中多线程编程的基本概念和创建线程的两种主要方式:继承Thread类和实现Runnable接口
【10月更文挑战第20天】《JAVA多线程深度解析:线程的创建之路》介绍了Java中多线程编程的基本概念和创建线程的两种主要方式:继承Thread类和实现Runnable接口。文章详细讲解了每种方式的实现方法、优缺点及适用场景,帮助读者更好地理解和掌握多线程编程技术,为复杂任务的高效处理奠定基础。
38 2
|
2月前
|
Java 开发者
Java多线程初学者指南:介绍通过继承Thread类与实现Runnable接口两种方式创建线程的方法及其优缺点
【10月更文挑战第20天】Java多线程初学者指南:介绍通过继承Thread类与实现Runnable接口两种方式创建线程的方法及其优缺点,重点解析为何实现Runnable接口更具灵活性、资源共享及易于管理的优势。
44 1
|
1月前
|
Java
为什么一般采用实现Runnable接口创建线程?
因为使用实现Runnable接口的同时我们也能够继承其他类,并且可以拥有多个实现类,那么我们在拥有了Runable方法的同时也可以使用父类的方法;而在Java中,一个类只能继承一个父类,那么在继承了Thread类后我们就不能再继承其他类了。
26 0
|
3月前
|
存储 Java 程序员
优化Java多线程应用:是创建Thread对象直接调用start()方法?还是用个变量调用?
这篇文章探讨了Java中两种创建和启动线程的方法,并分析了它们的区别。作者建议直接调用 `Thread` 对象的 `start()` 方法,而非保持强引用,以避免内存泄漏、简化线程生命周期管理,并减少不必要的线程控制。文章详细解释了这种方法在使用 `ThreadLocal` 时的优势,并提供了代码示例。作者洛小豆,文章来源于稀土掘金。
【多线程面试题 二】、 说说Thread类的常用方法
Thread类的常用方法包括构造方法(如Thread()、Thread(Runnable target)等)、静态方法(如currentThread()、sleep(long millis)、yield()等)和实例方法(如getId()、getName()、interrupt()、join()等),用于线程的创建、控制和管理。
|
2月前
|
存储 消息中间件 资源调度
C++ 多线程之初识多线程
这篇文章介绍了C++多线程的基本概念,包括进程和线程的定义、并发的实现方式,以及如何在C++中创建和管理线程,包括使用`std::thread`库、线程的join和detach方法,并通过示例代码展示了如何创建和使用多线程。
58 1
C++ 多线程之初识多线程