题目要求:
有4个线程,其中两个线程每次对x加1,另外两个每次对x减1,如何实现?
分析:
x就是这4个线程要处理的共享数据,不同种线程有不同的处理方式,但操作的数据是共同的,联想到“窗口买票问题”,但是卖票只是单纯的减。
所以,多个线程访问共享对象或数据的方式,先看,如果每个线程执行的代码相同,那么就可以使用同一个Runnable对象,这个对象中有被共享的数据,如买票问题。
如果每个线程执行的代码不同,肯定需要不用的Runnable对象,有两种方式实现这些不同的Runnable对象之间的数据共享:
第一种:将共享数据封装到一个对象中,把这个共享数据所在的对象传递给不同的Runnable,每个线程对共享数据的操作也分给那个
对象完成,这样就可以实现对该数据处理的互斥与通信。
class ShareData { private int x = 0; public synchronized void addx(){ x++; System.out.println("x++ : "+x); } public synchronized void subx(){ x--; System.out.println("x-- : "+x); } } class MyRunnable1 implements Runnable{ private ShareData share1 = null; public MyRunnable1(ShareData share1) { this.share1 = share1; } public void run() { for(int i = 0;i<100;i++){ share1.addx(); } } } class MyRunnable2 implements Runnable{ private ShareData share2 = null; public MyRunnable2(ShareData share2) { this.share2 = share2; } public void run() { for(int i = 0;i<100;i++){ share2.subx(); } } } public class ThreadsVisitData { public static void main(String[] args) { ShareData share = new ShareData(); new Thread(new MyRunnable1(share)).start(); new Thread(new MyRunnable2(share)).start(); } }
第二种:
将这些Runnable对象作为某一个类的内部类,共享的数据作为外部类的成员变量,对共享数据的操作分配给外部类的方法来完成,以此实现对操作共享
数据的互斥和通信,作为内部类的Runnable来操作外部类的方法,实现对数据的操作
class ShareData { private int x = 0; public synchronized void addx(){ x++; System.out.println("x++ : "+x); } public synchronized void subx(){ x--; System.out.println("x-- : "+x); } } public class ThreadsVisitData { public static ShareData share = new ShareData(); public static void main(String[] args) { //final ShareData share = new ShareData(); new Thread(new Runnable() { public void run() { for(int i = 0;i<100;i++){ share.addx(); } } }).start(); new Thread(new Runnable() { public void run() { for(int i = 0;i<100;i++){ share.subx(); } } }).start(); } }
总结:要同步互斥的代码任务最好将他们分别放在独立的方法中,这些方法再放在同一个类中,这样比较容易实现操作的同步和通信
时间: 2024-10-19 16:14:32