多线程也称作“并发”,java中实现线程有两种方式:
1,继承Thread类
2,实现Runnable接口
下面写卖车票例题,分别使用两种方法
Thread:
public class ticket extends Thread {
int count = 100;
public void run(){
for(int i=count;i>0;i--){
System.out.println(Thread.currentThread().getName()+"卖出第"+i+"张车票");
}
}
}
public static void main(String[] args) {
// TODO Auto-generated method stub
ticket t = new ticket(); //创建线程对象
//创建4个线程,分别调用线程对象t启动
new Thread(t,"窗口1").start();
new Thread(t,"窗口2").start();
new Thread(t,"窗口3").start();
new Thread(t,"窗口4").start();
}
运行结果,并没有达到预期的四个窗口卖共同的100张票的效果,而是每个窗口分别卖了100张票,这是由于创建了四个线程,而每个线程又调用了线程对象t,就等于创建了四个资源,创造了400张票。
再看看用Runnable接口:
public class ticket2 implements Runnable {
int count = 100;
public void run() {
// TODO Auto-generated method stub
for(;;){
try {
Thread.sleep(100);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
if(count >= 0){
maipiao();
}else{
break;
}
}
}
/**
* 方法锁
*/
public synchronized void maipiao(){
count --;//卖出一张票
if(count >= 0){
System.out.println(Thread.currentThread().getName()+"卖出一张票,现剩余"+count+"张票!");
}
}
}
public static void main(String[] args) {
// TODO Auto-generated method stub
ticket2 t = new ticket2();
new Thread(t, "窗口1").start();
new Thread(t, "窗口2").start();
new Thread(t, "窗口3").start();
new Thread(t, "窗口4").start();
}
运行结果,因为添加了方法锁和睡眠时间,可以很清楚地看到,100张票分别被4个窗口卖掉。这里创建了4个线程,每个线程都调用的同一个ticket2对象中的run()方法,访问的是同一个变量count。
转载于:https://blog.51cto.com/12168943/1875284