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