首页 新闻 会员 周边 捐助

此程序为什么只有1个线程在执行?

0
悬赏园豆:5 [已解决问题] 解决于 2024-06-19 10:47

此程序为什么只有1个线程在执行?

代码如下:

package demo; public class AddSubDemo { public static void main(String[] args) { Resource resource = new Resource(); new Thread(new AddRunnable(resource)).start(); new Thread(new SubRunnable(resource)).start(); } } class AddRunnable implements Runnable { private Resource resource; public AddRunnable(Resource resource) { this.resource = resource; } @Override public void run() { while (true) { try { resource.add(); } catch (InterruptedException e) { e.printStackTrace(); } } } } class SubRunnable implements Runnable { private Resource resource; public SubRunnable(Resource resource) { this.resource = resource; } @Override public void run() { while (true) { try { resource.sub(); } catch (InterruptedException e) { e.printStackTrace(); } } } } class Resource { private int num = 0; private boolean flag = true; // true:执行ADD;false:执行SUB public synchronized void add() throws InterruptedException { if (this.flag = false) { super.wait(); } Thread.sleep(1000); this.num++; flag = false; System.out.println(Thread.currentThread().getName()+":" + this.num); super.notifyAll(); } public synchronized void sub() throws InterruptedException { if (this.flag == true) { super.wait(); } Thread.sleep(2000); this.num--; flag = true; System.out.println(Thread.currentThread().getName()+":" + this.num); super.notifyAll(); } }

日志如下:

Thread-0:1 Thread-0:2 Thread-0:3 Thread-0:4 Thread-0:5 Thread-0:6 Thread-0:7
renguanyu的主页 renguanyu | 小虾三级 | 园豆:841
提问于:2024-06-16 18:35
< >
分享
最佳答案
0

代码写错了

if (this.flag = false)  >> if (this.flag == false) 
就好了

renguanyu | 小虾三级 |园豆:841 | 2024-06-19 10:46
其他回答(2)
0

第 1 个线程占用了 Resource 对象锁没释放,第 2 个线程被阻塞在 resource.sub() 等待获取对象锁。

收获园豆:3
不安分的黑娃 | 园豆:169 (初学一级) | 2024-06-17 10:23
0

学习........................

收获园豆:2
tea2007 | 园豆:67 (初学一级) | 2024-06-17 10:28
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册