多线程也称作“并发”,java中实现线程有两种方式: 1,继承Thread类 2,实现Runnable接口 下面写卖车票例题,分别使用两种方法 Thread: 1 2 3 4 5 6 7 8 | 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+ "张车票" );
}
}
}
|
1 2 3 4 5 6 7 8 9 | 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接口: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 | 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+ "张票!" );
}
}
}
|
1 2 3 4 5 6 7 8 9 | 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。
|