多线程也称作“并发”,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。