分享

java多线程

 流曲频阳 2016-11-23

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

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多