多线程下 如何交替卖票?

Surrin1999 2018-09-09 11:22:40
今晚想着练个两个线程按顺序交替卖票的demo 写着写着发现思路卡住了 老是死锁 有人能提供下解决方案吗


public class ThreadDemo {
public static void main(String[] args) {
Thread t1 = new Thread(new MyRunnable(),"线程1");
Thread t2 = new Thread(new MyRunnable(),"线程2");

t1.start();
t2.start();
}
}



public class MyRunnable implements Runnable {
public static int ticket = 300;
Object lock = new Object();
static String preName;
static String newName;
boolean flag = true;
@Override
public void run() {
while (true) {
synchronized (lock) {
if (ticket > 0) {
if (flag) {
preName = Thread.currentThread().getName();
System.out.println(Thread.currentThread().getName() + "正在卖第" + (ticket--) + "张票");
flag = false;
continue;
}
newName = Thread.currentThread().getName();
if (newName.equals(preName)) {
try {
lock.wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
} else {
System.out.println(Thread.currentThread().getName() + "正在卖第" + (ticket--) + "张票");
preName = newName;
lock.notify();
}
}
}
if (ticket == 0) {
break;
}
}
}
}


我的思路是用旧名字和新名字来区分两个线程 然后如果名字一样 就wait() 等另一个名字不同的线程把它叫醒。。但是不知道为什么最后就死锁了 能解答下原因还有说下解决方案吗
...全文
356 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
Surrin1999 2018-09-11
  • 打赏
  • 举报
回复
之前你也回过我问题
Surrin1999 2018-09-11
  • 打赏
  • 举报
回复
之前你也回过我问他
Dan淡淡的心 2018-09-11
  • 打赏
  • 举报
回复
引用 7 楼 Surrin1999 的回复:
今晚结分
我看你很眼熟啊
Surrin1999 2018-09-11
  • 打赏
  • 举报
回复
今晚结分
Surrin1999 2018-09-11
  • 打赏
  • 举报
回复
引用 5 楼 qq_41054313 的回复:
实际开发中 还是用netty比较多 netty优化很好 学习难度来说 直接上手netty并不比 学习NIO后再看netty难 所以有很多都是直接看的netty


好的 谢谢啦
Surrin1999 2018-09-10
  • 打赏
  • 举报
回复
我自己解决了。。。。。new了两个runnable啊最捞的。。卧槽 散分好像也不太好 这里问一下 有没有大佬推荐下nio怎么学习? 基于netty框架来学吗 我看网上很多博客都写得一般
Dan淡淡的心 2018-09-10
  • 打赏
  • 举报
回复
实际开发中 还是用netty比较多 netty优化很好 学习难度来说 直接上手netty并不比 学习NIO后再看netty难 所以有很多都是直接看的netty
Dan淡淡的心 2018-09-10
  • 打赏
  • 举报
回复
引用 2 楼 Surrin1999 的回复:
我自己解决了。。。。。new了两个runnable啊最捞的。。卧槽 散分好像也不太好 这里问一下 有没有大佬推荐下nio怎么学习? 基于netty框架来学吗 我看网上很多博客都写得一般
NIO自己随便看看 然后就看netty就好 主要用NIO的人比较少了 网上资料很少 大都一个样子 NIO虽然相对于BIO难一点 也只是相对复杂一点 终归只是IO, BIO只是读写操作而已 NIO多了 轮训器 及监听 AIO需要系统支持而且性能不是很好 需要根据特定的需求来使用 平时用NIO就足够了 相对于AIO NIO更可控一点
verejava 2018-09-10
  • 打赏
  • 举报
回复
Java 多线程 之 wait等待 线程实例

http://www.verejava.com/?id=16992949250274
Surrin1999 2018-09-09
  • 打赏
  • 举报
回复
拜托了 卡住很难受

62,614

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧