开启掘金成长之旅!这是我参与「掘金日新计划 · 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();
}
}
- 打印的结果
- 接口
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();
}
}
- 打印的结果
线程不安全的问题导致的,没有做到唯一性,这时候就要加一把锁
关键字是( 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+"票");
}
}
}
- 打印结果如下: