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();
    }


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

相关文章
|
13天前
|
算法 安全 Java
【.NET Core】 多线程之(Thread)详解
【.NET Core】 多线程之(Thread)详解
19 1
|
19天前
|
Java 调度
Java 多线程系列Ⅰ(创建线程+查看线程+Thread方法+线程状态)
Java 多线程系列Ⅰ(创建线程+查看线程+Thread方法+线程状态)
|
20天前
|
Java 程序员
Java中的多线程编程:理解并应用Thread类和Runnable接口
【5月更文挑战第28天】在Java中,多线程编程是一个重要的概念,它允许同时执行多个任务。本文将深入探讨Java的多线程编程,包括Thread类和Runnable接口的使用,以及如何在实际项目中应用这些知识。我们将通过实例来理解这些概念,并讨论多线程编程的优点和可能的挑战。
|
20天前
|
Java 调度
"ava多线程基础-4:详解Thread类及其基本用法(二)
本文介绍了Java中线程中断和等待的相关概念。
27 0
|
20天前
|
Java Linux API
Java多线程基础-4:详解Thread类及其基本用法 (一)
Java 中的 `Thread` 类是用来管理线程的,每个线程都是通过 `Thread` 类的对象来描述。
60 0
|
25天前
|
Java
【JAVA学习之路 | 提高篇】创建与启动线程之二(继承Thread类)(实现Runnable接口)
【JAVA学习之路 | 提高篇】创建与启动线程之二(继承Thread类)(实现Runnable接口)
|
25天前
|
Java 调度
【JAVA学习之路 | 提高篇】进程与线程(Thread)
【JAVA学习之路 | 提高篇】进程与线程(Thread)
|
1月前
|
安全 Java 调度
Java一分钟:多线程编程初步:Thread类与Runnable接口
【5月更文挑战第11天】本文介绍了Java中创建线程的两种方式:继承Thread类和实现Runnable接口,并讨论了多线程编程中的常见问题,如资源浪费、线程安全、死锁和优先级问题,提出了解决策略。示例展示了线程通信的生产者-消费者模型,强调理解和掌握线程操作对编写高效并发程序的重要性。
57 3
|
1月前
|
Java API 调度
【Java多线程】Thread类的基本用法
【Java多线程】Thread类的基本用法
16 0
|
1月前
|
算法 安全 调度
【C++入门到精通】 线程库 | thread类 C++11 [ C++入门 ]
【C++入门到精通】 线程库 | thread类 C++11 [ C++入门 ]
27 1