线程中变量有共享变量和非共享变量的区别,很重要的概念,这里只讲共享变量。多个线程共享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在执行。