实现多线程的两种方式,卖票场景,亲测可用

写在开始

卖票场景:

  多线程共同卖票,总票数在多个卖票窗口共享

实现方式:

  1继承Thread类;

  2实现Runnable接口

正文开始

方式1 Thread继承

package com.example.demo;

/**
 * @Description:
 * @Author:tianminghai
 * @Date:2:55 PM 2018/10/24
 */
public class ThreadDemo extends Thread {

  private static int ticket = 100000;

  public ThreadDemo() {

  }

  @Override
  public void run() {
    while (true) {
      synchronized ("") {
        if (ticket > 0) {
          ticket--;
          System.out.println("当前线程号:" + Thread.currentThread().getId() + "剩余票数:" + this.ticket);
        }
      }
    }
  }

}

方式2 实现Runnable

package com.example.demo;

/**
 * @Date:2:55 PM 2018/10/24
 */
public class ThreadDemo2 implements Runnable {

    private static int ticket = 100;

    public ThreadDemo2() {

    }

    @Override
    public void run() {
        while (true) {
            synchronized ("") {
                if (ticket > 0) {
                    ticket--;
                    System.out.println("当前线程号:" + Thread.currentThread().getId() + "  剩余票数:" + this.ticket);
                }
            }
        }

    }

}

Client端

package com.example.demo;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;

@SpringBootApplication
public class DemoApplication {

    public static void main(String[] args) {
        SpringApplication.run(DemoApplication.class, args);
        for (int i = 0; i < 30; i++) {
            // 方式1
            new ThreadDemo().start();
            // 方式2
            new Thread(new ThreadDemo2()).start();
        }
    }
}

 

需要注意的点

    1由于总票数在多个卖票窗口共享,所以ticket应设为静态变量;

  2下面两种多线程实现方式都要使用synchronized进行封装,且封装的粒度要小不可以包含while等代码段

原文地址:https://www.cnblogs.com/tianmh/p/9844538.html

时间: 2024-11-08 21:47:17

实现多线程的两种方式,卖票场景,亲测可用的相关文章

java 实现多线程的两种方式

一.问题引入 说到这两个方法就不得不说多线程,说到多线程就不得不提实现多线程的两种方式继承Thread类和实现Runable接口,下面先看这两种方式的区别. 二. Java中实现多线程的两种方式 1.  继承Thread类 /** * 使用Thread类模拟4个售票窗口共同卖100张火车票的程序,实际上是各卖100张 */ public class ThreadTest { public static void main(String[] args){ new MyThread().start(

Java实现多线程的两种方式

实现多线程的两种方式: 方式1: 继承Thread类 A: 自定义MyThread类继承Thread类 B: 在MyThread类中重写run() C: 创建MyThread类的对象 D: 启动线程对象. 问题: a. 为什么要重写run方法? run()方法里封装的是被线程执行的代码 b. 启动线程对象用的是哪个方法? start()方法 c. run()和start()方法的区别? 直接调用run方法只是普通的方法调用 调用start方法先会启动线程,再由jvm调用run()方法 方式2:

Java中实现多线程的两种方式之间的区别

Java提供了线程类Thread来创建多线程的程序.其实,创建线程与创建普通的类的对象的操作是一样的,而线程就是Thread类或其子类的实例对象.每个Thread对象描述了一个单独的线程.要产生一个线程,有两种方法: ◆需要从Java.lang.Thread类派生一个新的线程类,重载它的run()方法:  ◆实现Runnalbe接口,重载Runnalbe接口中的run()方法. 为什么Java要提供两种方法来创建线程呢?它们都有哪些区别?相比而言,哪一种方法更好呢? 在Java中,类仅支持单继承

Java多线程:常用的实现多线程的两种方式

之所以说是常用的,是因为通过还可以通过java.util.concurrent包中的线程池来实现多线程.关于线程池的内容,我们以后会详细介绍;现在,先对的Thread和Runnable进行了解.本章内容包括: Thread和Runnable的简介 Thread和Runnable的异同点 Thread和Runnable的多线程的示例 Thread和Runnable简介 Runnable 是一个接口,该接口中只包含了一个run()方法.它的定义如下: public interface Runnabl

2.常用的实现多线程的两种方式

Thread和Runnable简介 Runnable 是一个接口,该接口中只包含了一个run()方法.它的定义如下: public interface Runnable { public abstract void run(); } Runnable的作用,实现多线程.我们可以定义一个类A实现Runnable接口:然后,通过new Thread(new A())等方式新建线程. Thread 是一个类.Thread本身就实现了Runnable接口.它的声明如下: public class Thr

实现多线程的两种方式

1.继承Thread类. 源码结构:public class Thread implements Runnable 从中可以看出Thread类实现了Runnable,由于java中不支持多继承,所以实现多线程时,可以采用实现Runnable的方式. 2.实现Runnable接口. 注意一下声明与调用不仅仅只是new一下,start一下,而是new两下,start一下: public class MyRunnable implements Runnable { public void run()

Java中实现多线程的两种方式

/**  * 使用Thread类模拟4个售票窗口共同卖100张火车票的程序  *   * 没有共享数据,每个线程各卖100张火车票  *   * @author jiqinlin  * */public class ThreadTest {    public static void main(String[] args){        new MyThread().start();        new MyThread().start();        new MyThread().st

多线程 编写多线程的两种方式

1.通过继承Thread编写多线程类 1 package org.zln.thread; 2 3 import java.util.Date; 4 5 /** 6 * Created by coolkid on 2015/6/21 0021. 7 */ 8 public class TestThread extends Thread{ 9 private int time;//休眠时间 10 private String user;//调用用户 11 12 public TestThread(i

启动多线程的两种情况比较

启动多线程有两种方式:(都是在主线程main线程下) 1. 使用同一个线程对象来启多个线程 2. 使用多个线程对象来启多个线程 这两种方式有什么区别呢?先贴上代码举例说明: 这是使用线程对象MyRunnable的同一个实例r来启动了两个线程 MyRunnable r = new MyRunnable(); Thread ta = new Thread(r,"Thread-A"); Thread tb = new Thread(r,"Thread-B"); ta.st