Android studio Thread的用法 -- 售票案例

29 阅读2分钟

开启掘金成长之旅!这是我参与「掘金日新计划 · 12 月更文挑战」的第2天,点击查看活动详情

本文讲两种两种方式:

1.继承(extends)

2.接口(implements)

一、说一下这两种方式的使用场景

  • 继承 :比如说两商家买票,每个商家有50张票
  • 接口 :火车站卖票,放50张票,有两个窗口在售票,两个窗口一共有50张票

二、使用案例

  • 继承
//创建一个自定义类继承Thread

public class MyThread extends Thread{
    private int ticket=50; //50张票
    private String name;

    public MyThread(String name) {
        this.name = name;
    }

    @Override
    public void run() {
        super.run();
        while (ticket>0){
            ticket--;
            System.out.println(name+ "卖掉了1张票,剩余票数为:"+ticket);
        }
    }
}

//调用测试  继承的用法 extends
 
public class MainActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        //继承的用法 extends
        MyThread myThread=new MyThread("商家一");
        myThread.start();
        MyThread myThread2=new MyThread("商家二");
        myThread2.start();
        
        //接口的用法 implements
//        MyThread2 myThread2=new MyThread2();
//        new Thread(myThread2,"1").start();
//        new Thread(myThread2,"2").start();

    }
}

  • 打印的结果

image.png

  • 接口
public class MyThread2 implements Runnable{
    private int ticket=50; //50张票
    @Override
    public void run() {
        while (ticket>0){
            ticket--;
            System.out.println(Thread.currentThread().getName()+"卖掉了第"+ticket+"票");
        }
    }
}

//调用测试  接口的用法 implements

public class MainActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        //继承的用法 extends
//        MyThread myThread=new MyThread("商家一");
//        myThread.start();
//        MyThread myThread2=new MyThread("商家二");
//        myThread2.start();

        //接口的用法 implements
        MyThread2 myThread2=new MyThread2();
        new Thread(myThread2,"窗口1").start();
        new Thread(myThread2,"窗口2").start();
        new Thread(myThread2,"窗口3").start();
    }
}

  • 打印的结果

image.png

线程不安全的问题导致的,没有做到唯一性,这时候就要加一把锁

关键字是( synchronized ):代表了,3个线程,进行排队(形成队列)停留在run()方法的前面,一个一个的等待执行

public class MyThread2 implements Runnable{
    private int ticket=50; //50张票
    @Override
    public synchronized void run() {
        while (ticket>0){
            ticket--;
            System.out.println(Thread.currentThread().getName()+"卖掉了第"+ticket+"票");
        }
    }
}
  • 打印结果如下:

image.png