美文网首页
多线程共享数据的方式:

多线程共享数据的方式:

作者: 木有鱼丸啦 | 来源:发表于2018-09-12 13:49 被阅读0次

    1,如果每个线程执行的代码相同,可以使用同一个Runnable对象,这个Runnable对象中有那个共享数据,例如,卖票系统就可以这么做。

    public class MulteThreadlShareData {

        public static void main(String[] args) {

            ShareData shareData = new ShareData();

            new Thread(shareData).start();

            new Thread(shareData).start();

        }

        static class ShareData implements Runnable{

            int count = 100;

            @Override

            public void run() {

                while(count>0){

                    decrease();

                }

            }

            public synchronized void decrease(){

                count--;

                System.out.println(Thread.currentThread().getName()+"this count: "+count);

            }

        }

    }

    2,如果每个线程执行的代码不同,这时候需要用不同的Runnable对象,例如,设计4个线程。其中两个线程每次对j增加1,另外两个线程对j每次减1,银行存取款

     

    有两种方法来解决此类问题:

    将共享数据封装成另外一个对象,然后将这个对象逐一传递给各个Runnable对象,每个线程对共享数据的操作方法也分配到那个对象身上完成,这样容易实现针对数据进行各个操作的互斥和通信

    public class MulteThreadlShareData2 {

        public static void main(String[] args) {

            final ShareData shareData = new ShareData();

            new Thread(new Decrease(shareData)).start();

            new Thread(new Increment(shareData)).start();

        }

        static class Decrease implements Runnable{

            private ShareData shareData;

            public Decrease(ShareData shareData){

                this.shareData=shareData;

            }

            @Override

            public void run() {

                shareData.decrease();

            }

        }

        static class Increment implements Runnable{

            private ShareData shareData;

            public Increment(ShareData shareData){

                this.shareData=shareData;

            }

            @Override

            public void run() {

                shareData.increment();

            }

        }

        static class ShareData{

            int count = 100;

            public synchronized void decrease(){

                count--;

                System.out.println(Thread.currentThread().getName()+"decrease this count: "+count);

            }

            public synchronized void increment(){

                count++;

                System.out.println(Thread.currentThread().getName()+"increment this count: "+count);

            }

        }

    }

    将Runnable对象作为一个类的内部类,共享数据作为这个类的成员变量,每个线程对共享数据的操作方法也封装在外部类,以便实现对数据的各个操作的同步和互斥,作为内部类的各个Runnable对象调用外部类的这些方法。

    public class MulteThreadlShareData3 {

        static int count = 100;

        public static void main(String[] args) {

            new Thread(new Decrease()).start();

            new Thread(new Increment()).start();

        }

        public synchronized static void decrease(){

            count--;

            System.out.println(Thread.currentThread().getName()+"decrease this count: "+count);

        }

        public synchronized static void increment(){

            count++;

            System.out.println(Thread.currentThread().getName()+"increment this count: "+count);

        }

        static class Decrease implements Runnable{

            @Override

            public void run() {

                decrease();

            }

        }

        static class Increment implements Runnable{

            @Override

            public void run() {

                increment();

            }

        }

    }

    上面两种方式的结合:将共享数据封装到另一个对象中,各个线程对共享数据操作的方法也分配到那个对象上去完成,对象作为外部类的成员变量或方法的局部变量,每个runnable对象作为外部类中的成员内部类或局部内部类。

    public class MulteThreadlShareData1 {

        public static void main(String[] args) {

            final ShareData shareData = new ShareData();

            new Thread(new Runnable() {

                @Override

                public void run() {

                    while(true){

                        shareData.decrease();

                    }   

                }

            }).start();

            new Thread(new Runnable() {

                @Override

                public void run() {

                    while(true){

                        shareData.increment();

                    }

                }

            }).start();

        }

        static class ShareData{

            int count = 100;

            public synchronized void decrease(){

                count--;

                System.out.println(Thread.currentThread().getName()+"this count: "+count);

            }

            public synchronized void increment(){

                count++;

                System.out.println(Thread.currentThread().getName()+"this count: "+count);

            }

        }

    }

    相关文章

      网友评论

          本文标题:多线程共享数据的方式:

          本文链接:https://www.haomeiwen.com/subject/tdevgftx.html