java线程循环_Java多线程永远同步块循环

我实现了示例程序,以确保每次执行特定进程的线程不超过5个。但结果并不像预期的那样。

public class MiscUtils{

private volatile static int count = 0;

public synchronized static int getCount() {

return count;

}

public synchronized static boolean incrementCounter() throws InterruptedException {

System.out.println("count - " + count);

while(MiscUtils.getCount() > 4) {

System.out.println(Thread.currentThread().getName() + " Sleeping..");

Thread.sleep(1000 * 5);

}

System.out.println("Thread acquired " + Thread.currentThread().getName());

if(count > 4) {

return false;

}

count++;

return true;

}

public synchronized static boolean decrementCounter() {

System.out.println("Decrement Called " + Thread.currentThread().getName());

count--;

return true;

}

public static void main(String[] args) throws InterruptedException {

Runnable r = new Runnable() {

@Override

public void run() {

try {

//System.out.println(new Date() + " :: Thread incremented");

MiscUtils.incrementCounter();

Thread.sleep(10 * 1000);

} catch (InterruptedException e) {

// TODO Auto-generated catch block

e.printStackTrace();

}

MiscUtils.decrementCounter();

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

}

};

int count = 10;

for(int i = 0; i < count; i++) {

Thread s = new Thread(r);

System.out.println(new Date() + "Thread " + i + " starting..");

s.start();

System.out.println(new Date() + "Thread " + i + " started..");

Thread.sleep(1 * 1000);

}

}

}

实际产量:

Mon Dec 30 19:29:20 IST 2019Thread 0 starting..

Mon Dec 30 19:29:20 IST 2019Thread 0 started..

count - 0

Thread acquired Thread-0

Mon Dec 30 19:29:21 IST 2019Thread 1 starting..

Mon Dec 30 19:29:21 IST 2019Thread 1 started..

count - 1

Thread acquired Thread-1

Mon Dec 30 19:29:22 IST 2019Thread 2 starting..

Mon Dec 30 19:29:22 IST 2019Thread 2 started..

count - 2

Thread acquired Thread-2

Mon Dec 30 19:29:23 IST 2019Thread 3 starting..

Mon Dec 30 19:29:23 IST 2019Thread 3 started..

count - 3

Thread acquired Thread-3

Mon Dec 30 19:29:24 IST 2019Thread 4 starting..

Mon Dec 30 19:29:24 IST 2019Thread 4 started..

count - 4

Thread acquired Thread-4

Mon Dec 30 19:29:25 IST 2019Thread 5 starting..

Mon Dec 30 19:29:25 IST 2019Thread 5 started..

count - 5

Thread-5 Sleeping..

Mon Dec 30 19:29:26 IST 2019Thread 6 starting..

Mon Dec 30 19:29:26 IST 2019Thread 6 started..

Mon Dec 30 19:29:27 IST 2019Thread 7 starting..

Mon Dec 30 19:29:27 IST 2019Thread 7 started..

Mon Dec 30 19:29:28 IST 2019Thread 8 starting..

Mon Dec 30 19:29:28 IST 2019Thread 8 started..

Mon Dec 30 19:29:29 IST 2019Thread 9 starting..

Mon Dec 30 19:29:29 IST 2019Thread 9 started..

Thread-5 Sleeping..

Thread-5 Sleeping..

Thread-5 Sleeping..

Thread-5 Sleeping..

Thread-5 Sleeping..

Thread-5 Sleeping..

Thread-5 Sleeping..

预期产量-

Mon Dec 30 19:29:20 IST 2019Thread 0 starting..

Mon Dec 30 19:29:20 IST 2019Thread 0 started..

count - 0

Thread acquired Thread-0

Mon Dec 30 19:29:21 IST 2019Thread 1 starting..

Mon Dec 30 19:29:21 IST 2019Thread 1 started..

count - 1

Thread acquired Thread-1

Mon Dec 30 19:29:22 IST 2019Thread 2 starting..

Mon Dec 30 19:29:22 IST 2019Thread 2 started..

count - 2

Thread acquired Thread-2

Mon Dec 30 19:29:23 IST 2019Thread 3 starting..

Mon Dec 30 19:29:23 IST 2019Thread 3 started..

count - 3

Thread acquired Thread-3

Mon Dec 30 19:29:24 IST 2019Thread 4 starting..

Mon Dec 30 19:29:24 IST 2019Thread 4 started..

count - 4

Thread acquired Thread-4

Mon Dec 30 19:29:25 IST 2019Thread 5 starting..

Mon Dec 30 19:29:25 IST 2019Thread 5 started..

count - 5

Thread-5 Sleeping..

Mon Dec 30 19:29:26 IST 2019Thread 6 starting..

Mon Dec 30 19:29:26 IST 2019Thread 6 started..

Mon Dec 30 19:29:27 IST 2019Thread 7 starting..

Mon Dec 30 19:29:27 IST 2019Thread 7 started..

Mon Dec 30 19:29:28 IST 2019Thread 8 starting..

Mon Dec 30 19:29:28 IST 2019Thread 8 started..

Mon Dec 30 19:29:29 IST 2019Thread 9 starting..

Mon Dec 30 19:29:29 IST 2019Thread 9 started..

Thread-5 Sleeping..

Thread-5 Sleeping..

Thread acquired Thread-5

Thread-6 Sleeping..

Thread acquired Thread-6

and so on...

从未调用DecrementCounter()方法。另外,我希望synchronized块更新getCount()方法中的count变量,以获取最新值。但它总是返回值5。

请告诉我哪里做错了。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值