继续浏览精彩内容
慕课网APP
程序员的梦工厂
打开
继续
感谢您的支持,我会继续努力的
赞赏金额会直接到老师账户
将二维码发送给自己后长按识别
微信支付
支付宝支付

多线程:(五)多个线程之间共享数据

那时年少轻狂
关注TA
已关注
手记 6
粉丝 18
获赞 71

简单的总结一下多线程共享数据的方式。其实,最重要的,是一个思想,一个面向对象的编程思想的建立。

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

/**
 * 卖票处理
 * @author yang
 */
public class SellTicket {  
    //卖票系统,多个窗口的处理逻辑是相同的
    public static void main(String[] args) {
        Ticket t = new Ticket();
        new Thread(t).start();
        new Thread(t).start();
    }
}

/**
 * 将属性和处理逻辑,封装在一个类中
 * @author yang
 */
class Ticket implements Runnable{

    private int ticket = 10;
    public synchronized void run() {
        while(ticket>0){
            ticket--;
            System.out.println("当前票数为:"+ticket);
        }
    }
}

打印结果:
当前票数为:9
当前票数为:8
当前票数为:7
当前票数为:6
当前票数为:5
当前票数为:4
当前票数为:3
当前票数为:2
当前票数为:1
当前票数为:0

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

/**
 * 一个线程加1,一个线程减1
 * @author yang
 */
public class MultiThreadShareData {

    public static void main(String[] args) {
        ShareData data = new ShareData();
        new Thread(new MyRunnable1(data)).start();
        new Thread(new MyRunnable2(data)).start();
    }

}

class MyRunnable1 implements Runnable {
    private ShareData data;

    public MyRunnable1(ShareData data) {
        this.data = data;
    }

    public void run() {
        data.decrement();
    }
}

class MyRunnable2 implements Runnable {
    private ShareData data;

    public MyRunnable2(ShareData data) {
        this.data = data;
    }

    public void run() {
        data.increment();
    }
}

class ShareData {

    private int j = 10;

    public synchronized void increment() {
        j++;
        System.out.println("线程:" + Thread.currentThread().getName() + "加操作之后,j = " + j);
    }

    public synchronized void decrement() {
        j--;
        System.out.println("线程:" + Thread.currentThread().getName() + "加操作之后,j = " + j);
    }
}
关键还是思想:将共享数据和处理逻辑,封装在一个类中。业务逻辑(即加1的线程和减1的线程操作)在执行时,直接调用该类中的处理逻辑。这样做,更符合面向对象,更易于维护。

总结一下,对于多线程间对共享变量的操作,还是要实现互斥,使得对该共享变量的操作,实现原子性即可。

好了,简洁总结,深刻理解。有不对的地方,欢迎指出,在此谢过。

原文:多线程:(五)多个线程之间共享数据


那时年少轻狂,把喜欢当做筹码,才敢肆无忌惮的任性。
----那时年少轻狂

打开App,阅读手记
2人推荐
发表评论
随时随地看视频慕课网APP