Java 并发编程实战 -- 100个线程的顺序交替打印问题

  • 问题描述:100个线程,交替打印 1 - 10000 数字。
	Thread 0 : 0 
	Thread 1 : 1
	...
	Thread 98 : 98
	Thread 99 : 99
	...
	...
	Thread 0 : 9900
	Thread 1 : 9901
	...
	Thread 98: 9998
	Thread 99: 9999
	@Test
	public void testPrintNum() throws InterruptedException {
		Thread[] ts = new Thread[100];
		for (int i = 0; i < 100; i++) {
			Thread t = new PrintThread(i);
			ts[i] = t;
			t.start();
		}
		for (Thread t : ts) {
			t.join();
		}
	}

	static class PrintThread extends Thread {
		private final int serialNo;
		private static final AtomicInteger ai = new AtomicInteger(0);
		private static final CyclicBarrier cb = new CyclicBarrier(100);

		public PrintThread(int serialNo) {
			this.serialNo = serialNo;
		}

		@Override
		public void run() {
			int num = serialNo;
			while (num < 10000) {
				// 保证每轮线程打印的顺序性
				while (ai.get() % 100 != serialNo) {
					Thread.currentThread().yield();
				}

				System.out.println("Thread " + serialNo " : " + num);
				ai.incrementAndGet();
				num += 100;

				// 保证轮数的有序性
				try {
					cb.await();
				} catch (InterruptedException e) {
					e.printStackTrace();
				} catch (BrokenBarrierException e) {
					e.printStackTrace();
				}
			}
		}
	}
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值