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

来源:互联网 发布:淘宝主图怎么做 编辑:程序博客网 时间:2024/05/22 01:40

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

MyThread类:

package test;public class MyThread extends Thread {private int ticket = 20;@Overridepublic 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;@Overridepublic 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在执行。