线程实现的两种方式及区别(代码片段)

zuixinxian zuixinxian     2022-12-27     465

关键词:

我们来用最经典的卖票的案例,表明两种实现方式的区别,同时分析线程不安全产生的原因

一、继承Thread类

package test;

/**
 * @Description
 * @Author shusheng
 * @Email [email protected]
 * @Date 2018/8/31
 */
public class SellTicketOne extends Thread

    private static int tickets = 100;

    @Override
    public void run()
        while(true)
            if(tickets>0)
                System.out.println(getName()+"正在出售第"+tickets+"张票");
                tickets--;
            
        
    

二、实现Runnable接口

package test;

/**
 * @Description
 * @Author shusheng
 * @Email [email protected]
 * @Date 2018/8/31
 */
public class SellTicketTwo implements Runnable

    private static int tickets = 100;

    @Override
    public void run()
        while(true)
            if(tickets>0)
                System.out.println(Thread.currentThread().getName()+"正在出售第"+tickets+"张票");
                tickets--;
            
        
    

启动线程

package test;

/**
 * @Description
 * @Author shusheng
 * @Email [email protected]
 * @Date 2018/8/31
 */
public class SellTicketTest 

    public static void main(String[] args) 

        SellTicketOne one1 = new SellTicketOne();
        SellTicketOne one2 = new SellTicketOne();
        SellTicketOne one3 = new SellTicketOne();
        one1.setName("窗口一");
        one2.setName("窗口二");
        one3.setName("窗口三");
        one1.start();
        one2.start();
        one3.start();

        SellTicketTwo two = new SellTicketTwo();
        Thread t1 = new Thread(two,"窗口四");
        Thread t2 = new Thread(two,"窗口五");
        Thread t3 = new Thread(two,"窗口六");
        t1.start();
        t2.start();
        t3.start();

    

可以看到,二者的主要区别是:

1.实现Runnable接口的方式可以避免由于JAVA单继承带来局限性

2.实现Runnable接口的方式,适用多个相同程序的代码去处理同一个资源的情况,把线程同程序的代码、数据有效分离,较好的体现了面向对象的设计思想。

 

加上每次卖票延迟200毫秒,运行程序,发现两个问题:

A:相同的票卖了多次:CPU的一次操作必须是原子性

B:出现了负数票:随机性和延迟导致的

 

线程的两种实现方式(代码片段)

线程的两种实现方式(1)继承Thread类``/***继承Thread类**/publicclassPayThreadextendsThread@Overridepublicvoidrun()System.out.println("继承Thread");publicstaticvoidmain(String[]args)ThreadpayThread=newPayThread();payT 查看详情

实现多线程编程的两种方式(代码片段)

1.继承Thread类(Thread类实现了Runnable接口:publicclassThreadimplementsRunnable)2.实现Runnable接口实例代码:1.继承Thread类publicclassMyThreadDemopublicstaticvoidmain(String[]args)MyThreadthread=newMyThread();thread.start( 查看详情

实现多线程的两种方式(代码片段)

...ead类实现了Runnable,由于java中不支持多继承,所以实现多线程时,可以采用实现Runnable的方式。2.实现Runnable接口。 注意一下声明与调用不仅仅只是new一下,start一下,而是new两下,start一下:publicclassMyRunn 查看详情

18.2实现线程的两种方式(代码片段)

一、概述   在Java中主要提供两种方式实现线程,分别为继承java.lang.Thread类与实现java.lang.Runnable接口。二、继承Thread类   a、Thread类是java.lang包中的一个类,从这个类中实例化的对象代表线程,程序员启动一个新线程需要建... 查看详情

实现多线程的两种方式,卖票场景,亲测可用(代码片段)

写在开始卖票场景:  多线程共同卖票,总票数在多个卖票窗口共享实现方式:  1继承Thread类;  2实现Runnable接口正文开始方式1Thread继承packagecom.example.demo;/***@Description:*@Author:tianminghai*@Date:2:55PM2018/10/24*/publicclassThreadDemoex... 查看详情

匿名内部类实现线程的两种方式(代码片段)

publicstaticvoidmain(String[]args)//匿名内部类实现线程的两种方式/*Threadt1=newThread()@Overridepublicvoidrun()System.out.println("任务1...."+Thread.currentThread());;t1.start();*/newThread()publicvoidrun()System.out.println("任务1...."+Thread.currentThread());;.start();/*Threadt2=n... 查看详情

python-线程池的两种实现方式转载(代码片段)

1#!/usr/bin/envpython2#-*-coding:utf-8-*-34importqueue5importthreading6importcontextlib7importtime89StopEvent=object()101112classThreadPool(object):1314def__init__(self,max_num,max_task_num=None):15if 查看详情

传统线程技术中创建线程的两种方式(代码片段)

传统的线程技术中有两种创建线程的方式:一是继承Thread类,并重写run()方法;二是实现Runnable接口,覆盖接口中的run()方法,并把Runnable接口的实现扔给Thread。这两种方式大部分人可能都知道,但是为什么这样玩就可以呢?下面... 查看详情

java递归实现树形结构的两种方式(代码片段)

目录0、引言1、数据准备2、类型转化3、递归实现方法3.1、Java7及以下纯Java递归实现3.2、Java8及以上借助lamda表达式实现0、引言在开发的过程中,很多业务场景需要一个树形结构的结果集进行前端展示,也可以理解为是一... 查看详情

java中创建线程的两种方式有啥区别

java中创建线程的两种方式有什么区别参考技术A一种是继承Thread类,一种是实现Runnable接口,需要重写或者实现run()方法。没啥区别,因为java是单继承的,所以不可能让所有的类都继承Thread类,所以必须有这个Runnable接口。一般来... 查看详情

并发技术01传统线程技术中创建线程的两种方式(代码片段)

传统的线程技术中有两种创建线程的方式:一是继承Thread类,并重写run()方法;二是实现Runnable接口,覆盖接口中的run()方法,并把Runnable接口的实现扔给Thread。这两种方式大部分人可能都知道,但是为什么这样玩就可以呢?下面... 查看详情

java中实现多线程的两种方式(代码片段)

Java中对于对于多线程的实现主要提供了两种方法继承Thread()类实现Runnable接口接下来从这两个方面进行说明相关知识。继承Thread()类写一个类直接继承Thread()类,然后重写Thread()类的run()方法,调用其start()方法即可启动线程... 查看详情

java多线程带你用不一样的思维看创建线程的两种方式(代码片段)

文章目录创建线程的两种方式start和run方法解析彩蛋:同时用两种方法来实现同一个线程,会遇到什么小知识:调用start方法,线程就会立刻启动吗?创建线程的两种方式通过实现Runnable接口publicclassCreateThread//继承Th... 查看详情

go基础系列:go实现工作池的两种方式(代码片段)

workerpool简介workerpool其实就是线程池threadpool。对于go来说,直接使用的是goroutine而非线程,不过这里仍然以线程来解释线程池。在线程池模型中,有2个队列一个池子:任务队列、已完成任务队列和线程池。其中已完成任务队列可... 查看详情

1-多线程的两种实现方式(代码片段)

packageorg.ks.多线程;/**多线程(多线程程序实现的方式1)(掌握)*1.继承Thread*定义类继承Thread*重写run方法*把新线程要做的事写在run方法中*创建线程对象*开启新线程,内部会自动执行run方法*///现象:bb和ksdsb交替执行publicclassDemo2_Thread_real... 查看详情

2.常用的实现多线程的两种方式(代码片段)

...ublicinterfaceRunnablepublicabstractvoidrun();Runnable的作用,实现多线程。我们可以定义一个类A实现Runnable接口;然后,通过newThread(newA())等方式新建线程。 Thread 是一个类。Thread本身就实现了Runnable接口。它的声明如下:publicclassThr... 查看详情

java多线程带你用不一样的思维看创建线程的两种方式(代码片段)

文章目录创建线程的两种方式start和run方法解析彩蛋:同时用两种方法来实现同一个线程,会遇到什么小知识:调用start方法,线程就会立刻启动吗?创建线程的两种方式通过实现Runnable接口publicclassCreateThread//继承Th... 查看详情

java中多线程的两种创建方式(代码片段)

一丶继承Thread类实现多线程第一步:继承Thread类第二步:重写run()方法第三步:创建继承了Thread类的对象,调用start()方法启动。//线程创建方式一:/*第一步:继承Thread类第二步:重写run()方法第三步:创建继承了Thread类... 查看详情