IT程序员开发必备-各类资源下载清单,史上最全IT资源,个人收藏总结!
例子程序:
package edu.review;
import java.util.Random;
/**
* 题目要求:
* 两个售票窗口,对某一趟列车票进行操作,一个为售票窗口,一个为退票窗口,每个窗口售/退票100张
**/
public class Thread2ThreadDataShare {
public static void main(String[] args) {
// 方式1();//两种方式是等效的
方式2();
}
public static void 方式1(){
final DataShare data1 = new DataShare();
new Thread(new Runnable() {
@Override
public void run() {
for (int i = 0; i < 100; i++) {
try {
Thread.sleep(new Random().nextInt(20));
} catch (InterruptedException e) {
e.printStackTrace();
}
data1.increment();
}
}
}).start();
new Thread(new Runnable() {
@Override
public void run() {
for (int i = 0; i < 100; i++) {
try {
Thread.sleep(new Random().nextInt(20));
} catch (InterruptedException e) {
e.printStackTrace();
}
data1.decrement();
}
}
}).start();
}
public static void 方式2(){
DataShare data2 = new DataShare();
IncRunnable incRunnable = new IncRunnable(data2);
DecRunnable decRunnable = new DecRunnable(data2);
new Thread(incRunnable).start();
new Thread(decRunnable).start();
}
static class IncRunnable implements Runnable{
DataShare data = new DataShare();
public IncRunnable(DataShare data){
this.data = data;
}
@Override
public void run() {
for (int i = 0; i < 100; i++) {
try {
Thread.sleep(new Random().nextInt(20));
} catch (InterruptedException e) {
e.printStackTrace();
}
data.increment();
}
}
}
static class DecRunnable implements Runnable{
DataShare data = new DataShare();
public DecRunnable(DataShare data){
this.data = data;
}
@Override
public void run() {
for (int i = 0; i < 100; i++) {
try {
Thread.sleep(new Random().nextInt(20));
} catch (InterruptedException e) {
e.printStackTrace();
}
data.decrement();
}
}
}
}
class DataShare{
private int ticket = 100;
public synchronized void increment(){
ticket++;
System.out.println(Thread.currentThread().getName()+"退票,当前剩"+ticket+"张票!");
}
public synchronized void decrement(){
ticket--;
System.out.println(Thread.currentThread().getName()+"售票,当前剩"+ticket+"张票!");
}
}