多个线程共享变量的例子,线程为什么要Thread.sleep

线程中变量有共享变量和非共享变量的区别,很重要的概念,这里只讲共享变量。多个线程共享20张票的例子。

MyThread类:

package test;

public class MyThread extends Thread {

	private int ticket = 20;

	@Override
	public void run() {
		while (true) {
			try {
				Thread.sleep(100);
				synchronized (getClass()) {
					if (ticket > 0) {
						System.out.println("线程" + Thread.currentThread().getName() + "卖出1张票," + "余票" + (--ticket) + "张!");
					}
				}
			} catch (Exception e) {
				e.printStackTrace();
			}
		}
	}

}

测试类:

package httpClient;

public class Test {

	public static void main(String[] args) {
		MyThread myThread = new MyThread();
		Thread thread1 = new Thread(myThread,"A");
		Thread thread2 = new Thread(myThread,"B");
		Thread thread3 = new Thread(myThread,"C");
		thread1.start();
		thread2.start();
		thread3.start();
	}
}

测试结果:

线程B卖出1张票,余票19张!
线程A卖出1张票,余票18张!
线程C卖出1张票,余票17张!
线程B卖出1张票,余票16张!
线程A卖出1张票,余票15张!
线程C卖出1张票,余票14张!
线程B卖出1张票,余票13张!
线程C卖出1张票,余票12张!
线程A卖出1张票,余票11张!
线程B卖出1张票,余票10张!
线程C卖出1张票,余票9张!
线程A卖出1张票,余票8张!
线程B卖出1张票,余票7张!
线程A卖出1张票,余票6张!
线程C卖出1张票,余票5张!
线程B卖出1张票,余票4张!
线程C卖出1张票,余票3张!
线程A卖出1张票,余票2张!
线程B卖出1张票,余票1张!
线程A卖出1张票,余票0张!


注意的问题:

为什么需要休眠?

答:之所以每次Thread.sleep(100),是为了让其它线程有执行的机会,否则会只有一个线程在执行,现将程序代码改为不休眠:

package test;

public class MyThread extends Thread {

	private int ticket = 20;

	@Override
	public void run() {
		while (true) {
			try {
//				Thread.sleep(100);
				synchronized (getClass()) {
					if (ticket > 0) {
						System.out.println("线程" + Thread.currentThread().getName() + "卖出1张票," + "余票" + (--ticket) + "张!");
					}
				}
			} catch (Exception e) {
				e.printStackTrace();
			}
		}
	}

}
运行测试类结果:

线程A卖出1张票,余票19张!
线程A卖出1张票,余票18张!
线程A卖出1张票,余票17张!
线程A卖出1张票,余票16张!
线程A卖出1张票,余票15张!
线程A卖出1张票,余票14张!
线程A卖出1张票,余票13张!
线程A卖出1张票,余票12张!
线程A卖出1张票,余票11张!
线程A卖出1张票,余票10张!
线程A卖出1张票,余票9张!
线程A卖出1张票,余票8张!
线程A卖出1张票,余票7张!
线程A卖出1张票,余票6张!
线程A卖出1张票,余票5张!
线程A卖出1张票,余票4张!
线程A卖出1张票,余票3张!
线程A卖出1张票,余票2张!
线程A卖出1张票,余票1张!
线程A卖出1张票,余票0张!

结果显示,一直只有线程A在执行。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值