多线程-扩展篇(Lock锁,线程通信,线程池,定时器..)

1:多线程

    (1)为了更清晰的表达如何加锁和释放锁,,JDK5以后提供了一个新的锁对象Lock。   Lock锁

          Lock:

               void lock(): 获取锁。

               void unlock():释放锁。

          ReentrantLock是Lock的实现类. 

public class SellTicket implements Runnable {



    // 定义票

    private int tickets = 100;



    // 定义锁对象

    private Lock lock = new ReentrantLock();



    @Override

    public void run() {

        while (true) {

            try {

                // 加锁

                lock.lock();

                if (tickets > 0) {

                    try {

                        Thread.sleep(100);

                    } catch (InterruptedException e) {

                        e.printStackTrace();

                    }

                    System.out.println(Thread.currentThread().getName()

                            + "正在出售第" + (tickets--) + "张票");

                }

            } finally {

                // 释放锁

                lock.unlock();

            }

        }

    }



}

public class SellTicketDemo {

    public static void main(String[] args) {

        // 创建资源对象

        SellTicket st = new SellTicket();



        // 创建三个窗口

        Thread t1 = new Thread(st, "窗口1");

        Thread t2 = new Thread(st, "窗口2");

        Thread t3 = new Thread(st, "窗口3");



        // 启动线程

        t1.start();

        t2.start();

        t3.start();

    }

}

 

    (2)死锁问题的描述和代码体现

          死锁:两个或两个以上的线程在争夺资源的过程中,发生的一种相互等待的现象。

public class MyLock {

    // 创建两把锁对象

    public static final Object objA = new Object();

    public static final Object objB = new Object();

}

public class DieLock extends Thread {



    private boolean flag;



    public DieLock(boolean flag) {

        this.flag = flag;

    }



    @Override

    public void run() {

        if (flag) {

            synchronized (MyLock.objA) {

                System.out.println("if objA");

                synchronized (MyLock.objB) {

                    System.out.println("if objB");

                }

            }

        } else {

            synchronized (MyLock.objB) {

                System.out.println("else objB");

                synchronized (MyLock.objA) {

                    System.out.println("else objA");

                }

            }

        }

    }

}
/

 * 举例:

 *         中国人,美国人吃饭案例。

 *         正常情况:

 *             中国人:筷子两支

 *             美国人:刀和叉

 *         现在:

 *             中国人:筷子1支,刀一把

 *             美国人:筷子1支,叉一把

 */

public class DieLockDemo {

    public static void main(String[] args) {

        DieLock dl1 = new DieLock(true);

        DieLock dl2 = new DieLock(false);



        dl1.start();

        dl2.start();

    }

}

 

    (3)

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值