首页 > 其他分享 >创建多线程继承Thread和实现Runnable以及synchronized的注意事项

创建多线程继承Thread和实现Runnable以及synchronized的注意事项

时间:2023-08-27 09:11:06浏览次数:36  
标签:Runnable synchronized Thread num new Ticket 多线程

关于创建多线程继承Thread和实现Runnable以及synchronized的注意事项

  1. 以下是利用多线程模拟购票的代码

    public class Sell {
        public static void main(String[] args) {
            Ticket ticket = new Ticket();
            Ticket ticket1 = new Ticket();
            ticket.start();
            ticket1.start();
            Ticket2 ticket21 = new Ticket2();
            new Thread(ticket21, "小红").start();
            new Thread(ticket21, "小蓝").start();
        }
    }
    
    class Ticket extends Thread {
        private static int num = 100;
        private static Object Ticket = new Object();
    
        @Override
        public void run() {
            synchronized (Ticket) {
                while (true) {
                    try {
                        Thread.sleep(100);
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                    if (num == 0) {
                        break;
                    }
                    if (num <= 100 && num > 0) {
                        System.out.println(Thread.currentThread().getName() + "maile" + num--);
                    }
                }
            }
    
        }
        class Ticket2 implements Runnable {
        private int num = 100;
        boolean loop = true;
    
        @Override
        public void run() {
            while (loop) {
                sell();
            }
        }
    
        public synchronized void sell() {
            try {
                Thread.sleep(100);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            if (num == 0) {
                loop = false;
                return;
            }
            if (num <= 100 && num > 0) {
                System.out.println(Thread.currentThread().getName() + "maile" + num--);
            }
        }
    }
    
  2. 在继承Thread方法下,想实现多线程抢票,票数要设置成静态属性(随着类加载而加载),因为要让创建实例化出来的对象都访问的是同一个票数。

  3. synchronized关键字标志的代码块来实现同一时间只有一个线程可以访问同一个对象,本质上是和对象上的“互斥锁”联系,获取对象上的互斥锁的过程,

    synchronized修饰非静态同步方法时,对象是This或者是其他同一对象,比如,上面的继承Thread方法的Object Ticket,他就相当于购票的工作人员,每个工作人员都有一把锁,工作人员可以不同,但都是一次只能给一个人钥匙,打开售票口售票
    修饰静态同步方法时,对象是当前类本身(Ticket.class)。

标签:Runnable,synchronized,Thread,num,new,Ticket,多线程
From: https://www.cnblogs.com/f2825417199/p/17659856.html

相关文章

  • 无涯教程-Python - 多线程
    运行多个线程类似于同时运行多个不同的程序,但具有以下优点-一个进程中的多个线程与主线程共享相同的数据空间,因此比起单进程,它们可以更轻松地共享信息或彼此通信。有时称为轻量级进程的线程,它们不需要太多的内存开销。开始新线程要生成另一个线程,您需要调用thread模块中可......
  • Python多线程
    当进行多线程编程时,涉及到以下几个关键概念和操作多线程是指在一个进程中同时运行多个线程,每个线程都可以执行不同的任务。线程是操作系统能够进行运算调度的最小单位,它是进程中的一个实体,可以被操作系统独立调度。以下是与多线程相关的一些核心概念:1.**进程和线程**:-进程......
  • 上位机_C#多线程的取消、继续、停止
    publicForm1(){InitializeComponent();Task.Run(async()=>{for(inti=0;i<1000;i++){if(cancellationToken.IsCancellationReq......
  • 多线程|加锁操作
    classCounter{publicintcount=0;publicvoidadd(){count++;}}publicclasssynDemo{publicstaticvoidmain(String[]args){Countercounter=newCounter();Threadt1=newThread(()->{for(inti=......
  • allure报告中firefox信息不展示(多浏览器或多线程执行时只显示一个浏览器的日志)
    安装的allure-pytest的版本要是2.11.1之前的(之后的版本有test_result.historyId,但位置及方法不一样,我目前没研究怎么修改)在依赖包Lib--site-packages--allure_pytest--listener.py文件里修改test_result.historyId=md5(item.nodeid)变成test_result.historyId=md5(item.nod......
  • 什么是多线程,多线程的优劣?
    多线程:多线程是指程序中包含多个执行流,即在一个程序中可以同时运行多个不同的线程来执行不同的任务。多线程的好处:可以提高CPU的利用率。在多线程程序中,一个线程必须等待的时候,CPU可以运行其它的线程而不是等待,这样就大大提高了程序的效率。也就是说允许单个程序创建多个......
  • java多线程使用详解与案例,超详细
    一、创建线程的方式1、继承Thread类让子类继承Thread线程类子类必须重写Thread类的run方法创建一个自己定义的线程对象调用start()方法启动线程//测试类/***1、让子类继承Thread线程类*/publicclassThreadTest1extendsThread{//2、子类必须重写Thread类......
  • Java 多线程处理 for 循环数据
    对于必须在for循环内进行查询的场景,可采用以下几种方式进行优化。1、主线程与子线程无先后顺序publicstaticvoidmain(String[]args)throwsInterruptedException{for(inti=0;i<5;i++){ThreadUtil.execAsync(()->{......
  • 多线程 问答
    1、怎么创建线程池用threadPoolExecutor去创建,核心线程数量,最大线程数量,保活时间,时间单位,工作队列publicThreadPoolExecutor(intcorePoolSize,intmaximumPoolSize,longkeepAliveTime,......
  • python 多线程
    在python中,I/O密集型任务可以用多线程的方式来实现(threading库);然而,对于计算密集型任务,由于python中全局锁GIL的存在,多线程并不能起到一个加速的作用。所以此时,一般使用多进程的方式实现(multiprocessing库)。多线程threading:一个人有与异性聊天和看剧两件事要做。单线程的她可......