java多线程(2)----实例解析

上一篇我们讲了一下多线程的概念。这一篇,我们用一些比较简单的例子,来看看多线程在代码层次上的实现过程。我们现在和之后将的所有多线程,都将采用实现Runnable 接口的方式,因为我比较喜欢这个方式。。。我们来用两种方式进行同步锁,这两个例子都是网上随便找的,这里就是做一个总结。

一:synchronized

public class PickRunnableimplements Runnable{

    private Integertickettotal =100;

    @Override

    public void run() {

        while (true) {

            synchronized (this) {

                if (tickettotal >0) {

                    try {

                        Thread.sleep(1000);

                    }catch (InterruptedException e) {

                        // TODO Auto-generated catch block

                        e.printStackTrace();

                    }

                System.out.println(Thread.currentThread().getName() +"售出了第" + (tickettotal--) +"张票");

            }

           }

        }

    }

}

二:lock()和unlock()

// 定义锁

private Locklock =new ReentrantLock();

@Override

public void run() {

        while (true) {

            lock.lock();

            if (tickettotal >0) {

                try {

                    Thread.sleep(1000);

                }catch (InterruptedException e) {

                    // TODO Auto-generated catch block

                    e.printStackTrace();

                }

            System.out.println(Thread.currentThread().getName() +"售出了第" + (tickettotal--) +"张票");

        }

        lock.unlock();

    }

}

三:在主方法中调用

PickRunnable pickRunnable =new PickRunnable();

Thread t1 =new Thread(pickRunnable,"第一售票厅");

Thread t2 =new Thread(pickRunnable,"第二售票厅");

Thread t3 =new Thread(pickRunnable,"第三售票厅");

t1.start();

t2.start();

t3.start();

这里可以看到我们的线程里面,在run方法中,都加了一个while(true),为什么呢,其实这个while不是强制要加的,只不过,run方法本身不会自己循环,只执行一次,所以需要循环的,必须要加个while,但是如果只要求执行一次的,可以不加。

还要特别注意synchronized是非公平锁,随机获得锁,不一会会按照执行顺序执行。lock()和unlock()是公平锁,

你可能感兴趣的:(java多线程(2)----实例解析)