问题
1.卖票系统(如果每个线程执行的代码相同,可以使用同一个Runnable对象,这个Runnable对象中有那个共享数据)
解决
public class MultiThreadShareDataStudy { public static void main(String[] args) { TicketSystem t1 = new TicketSystem(); new Thread(t1).start(); new Thread(t1).start(); } } class TicketSystem implements Runnable{ private int count = 100; @Override public void run() { // TODO Auto-generated method stub while(true){ if(count > 0){ count--; System.out.println("当前执行线程 "+Thread.currentThread().getName()+"票剩余数量:"+count); } } } }2.设计4个线程,其中两个线程对j加1,另外两个线程对j减1,写出程序。(如果每个线程执行的代码不同,需要不同的Runnable对象)
解决
<1> 将共享数据封装在另外一个对象中,然后将这个对象逐一传给Runnbale对象,每个线程对共享数据的操作方法也分配到那个对象身上去完成,这样容易实现对数据进行各个操作的互斥和通信。
public class MultiThreadShareDataStudy { public static void main(String[] args) { ShareData data = new ShareData(); new Thread(new Runnable1(data)).start(); new Thread(new Runnable2(data)).start(); } } class Runnable1 implements Runnable{ private ShareData data; public Runnable1(ShareData data) { this.data = data; } @Override public void run() { data.decrease(); } } class Runnable2 implements Runnable{ private ShareData data; public Runnable2(ShareData data) { this.data = data; } @Override public void run() { data.increase(); } } class ShareData{ private int j = 100; public synchronized void increase(){ j++; System.out.println("当前执行线程 "+Thread.currentThread().getName()+"执行加操作,j="+j); } public synchronized void decrease(){ j--; System.out.println("当前执行线程 "+Thread.currentThread().getName()+"执行减操作,j="+j); } }<2> 将Runnable对象作为某个类的内部类,共享数据作为外部类的成员变量,每个线程对数据操作的方法也分配给外部类,实现对共享数据的操作的互斥和通信,作为内部类的各个Runnable对象调用外部类这些方法。
public static ShareData data1 = new ShareData(); public static void main(String[] args) { new Thread(new Runnable() { @Override public void run() { data1.decrease(); } }).start(); new Thread(new Runnable() { @Override public void run() { data1.increase(); } }).start(); } } class ShareData{ private int j = 100; public synchronized void increase(){ j++; System.out.println("当前执行线程 "+Thread.currentThread().getName()+"执行加操作,j="+j); } public synchronized void decrease(){ j--; System.out.println("当前执行线程 "+Thread.currentThread().getName()+"执行减操作,j="+j); } }<3>第三种方式
public class MultiThreadShareDataStudy { private int j = 100; public static void main(String[] args) { MultiThreadShareDataStudy m = new MultiThreadShareDataStudy(); Dec de = m.new Dec(); InCrease in = m.new InCrease(); new Thread(in).start(); new Thread(de).start(); } public synchronized void increase(){ j++; System.out.println("当前执行线程 "+Thread.currentThread().getName()+"执行加操作,j="+j); } public synchronized void decrease(){ j--; System.out.println("当前执行线程 "+Thread.currentThread().getName()+"执行减操作,j="+j); } class InCrease implements Runnable{ @Override public void run() { increase(); } } class Dec implements Runnable{ @Override public void run() { decrease(); } } }