您的位置:首页 > 编程语言 > Java开发

java多线程编程注意问题

2014-06-17 11:37 375 查看
java多线程编程注意问题

多线程的概念问度娘 ,大部分是千篇一律的。对于编程经验不是很丰富的程序员是比较难消化的。

作者从实际应用的角度来分析java多线程编程应注意的问题。

应用场景假设:

一个影院有三个售票口,

分别用于向儿童、成人和老人售票。影院为每个窗口放有100张电影票,

分别是儿童票、成人票和老人票。(一个售票员相当于一个CPU,电影院最多可提供3名售票员).

问题:怎样使电影院售票速度最快。(很多人在排队等待买票)。

那么可想而知,我们是开3个售票窗口,让3名售票员都动起来。这就是多线程。

在java平台多线程编程的程序员都知道,线程编程有2种实现办法继承Thread 和实现Runnable接口。

我们先来看用继承的办法实现。

public class MutliThread  extends Thread{

    private int ticket=100;//每个线程都拥有100张票

    public void run(){

        while(ticket>0){

            

            System.out.println(ticket--+" is saled by "+Thread.currentThread().getName());

            try {

                Thread.sleep(2000);

            } catch (InterruptedException e) {

                e.printStackTrace();

            }

        }

    }

}

测试类

public class MutliThreadDemo {

    public static void main(String [] args){

        MutliThread m1=new MutliThread("Window 1");

        MutliThread m2=new MutliThread("Window 2");

        MutliThread m3=new MutliThread("Window 3");

        m1.start();

        m2.start();

        m3.start();

    }

    }

问题2 。如果影院的票总计是100张,3名售票员同事售票。上述继承的办法是否能满足要求。

经过分析明显不能满足,因为无法实现多线程资源共享。这个时候我们就需要采用实现Runnable接口的办法。

public class MutliThread  implements Runnable{

    private int ticket=100;//每个线程都拥有100张票

    public void run(){

        while(ticket>0){

            

            System.out.println(ticket--+" is saled by "+Thread.currentThread().getName());

            try {

                Thread.sleep(2000);

            } catch (InterruptedException e) {

                e.printStackTrace();

            }

        }

    }

}

测试类:

public class MutliThreadDemo {

    public static void main(String [] args){

        MutliThread m=new MutliThread();

        Thread t1=new Thread(m,"Window "+i);

    Thread t2=new Thread(m,"Window "+i);

    Thread t3=new Thread(m,"Window "+i);

    t1.start();

    t2.start();

    t3.start();

    }

    }

对于第2中多线程,我们的线程是不是安全,是执行了100次?答案是肯定的。

作者将打印的语句进行了比对。确实是100次。

如果将变量换成静态的,就是大于100次。是不满足我们的业务需求。

其实写个多线程类并不难,难的是要分析我们的线程是不是安全的。这个安全就是满足我们的业务需求。

那在多线程编程的时候,我们要注意什么问题了。

总结:

1.多线程共享资源,执行同一任务,需要Runnable接口。

2 静态方法通常是安全的。静态成员变量是不安全的。

3.如何解决我们的安全问题,通常的做法是锁机制,或者用普通成员变量。

4.举例:HashMap  与 currentHashMap . 区别: hashmap 比currenthashmap执行效率要高。但线程不安全。 而currenthashmap线程是安全的。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息