使用Java的线程有两种方式
1.继承Thread类,重写run方法
class A extends Thread{
@Override
public void run() {
super.run();//重写默认调用父类Thread的run方法,也可以自己编写别的
}
}
2.实现Runnable接口,重写run方法
class B implements Runnable{
@Override
public void run() {//同上,但因为是实现接口所以必须自己写run方法
}
}
线程的启动需要用Thread类中的start方法
start方法其实质是去调用run方法
启动A线程
A.start();
启动B线程
new Thread(new b).start();
因为start方法在Thread类中,实现Runnable接口的类没有此方法,所以需要把它放到一个Thread对象中调用此方法
现在我们来做一个例题
卖车票,作用是两个线程同时取钱,一次取1000,余额不足时线程结束
public class test {
public static void main(String[] args) {
sell t=new sell();//定义一个sell对象
Thread t1=new Thread(t);
t1.setName("t1");
Thread t2=new Thread(t);
t2.setName("t2");
t2.start();//启动第一个线程
t1.start();//启动第二个线程
}
}
class sell implements Runnable{//一个实现接口的sell类
private int x=10000;//设置初始金额为10000
@Override
public void run() {//重写run方法
while(true){
synchronized (this){//synchronized守护线程,咱们下次再讲
if(x < 1000)
{
System.out.println("余额不足");
break;
}
x-=1000;
System.out.println(Thread.currentThread().getName()+ "取了1000,剩余"+x);
try {
Thread.sleep(1000);//休眠1000毫秒,可能会有异常,所以用try-catch
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}
}