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+"张票!"); } }