线程间通信原理

本文详细介绍了线程间通信的基本原理,包括通过共享进程变量、使用Thread Local Storage(TLS)以及Java中的并发控制手段如Synchronize、Semaphore和Lock。文章以Android的Handler和Looper为例,阐述了线程通信在实际应用中的实现方法。
摘要由CSDN通过智能技术生成

从操作系统的角度讲,线程间通信比进程间通信要容易的多,因为线程之间可以共享进程的内存空间。因此,他们可以共享位于进程全局数据区和栈和堆上的所有内容。

唯一只属于某个线程的就是线程的-------它可以存放只属于线程的对象。

下面逐一解读线程间通信方式:

1.   共享进程的变量

这是最基本的通信方式,但要注意不要共享线程栈上的变量,因为它随时可能被某个线程销毁,而另一个线程就无法访问它了。

所以Java编译器不允许使用栈上的变量来共享。


例子1:

如下面这个编译器是会报错的,

protectedvoid onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
int i=0;
Thread a=newThread(new Runnable(){
@Override
public voidrun() {
// TODOAuto-generated method stub
i++;
}
});
}

上面的自动变量i可以看做是进程的变量,但它有可能被申请它的线程销毁,因为无法用来进行共享。


例子2:

正面的例子比如android中的handler,它是需要在进程空间共享的。

2.   TLS(Thread Local Storage)

线程本地存储,本质上是存储一系列线程号和Looper对象的key-value键值对。

比如Android的Looper

public finalclass Looper {
privatestatic final String TAG = "Looper";
    // sThreadLocal.get() will return null unlessyou've called prepare().
    static final ThreadLocal<Looper>sThreadLocal = new ThreadLocal<Looper>();
    private static Looper sMainLooper; //guarded by Looper.class
    final MessageQueue mQueue;
    final Thread mThread;
    private Printer mLogging;
}

Looper有一个静态的

static final ThreadLocal<Looper> sThreadLocal = newThreadLocal<Looper>();

ThreadLocal本质上是一系列线程号和Looper对象的key-value键值对,因为sThreadLocal是静态的,所以它为所有的线程所共享。

而sThreadLocal.get()就是获取当前线程对应的Looper。

例子:

起一个Worker线程来做事情   

private static class Worker implementsRunnable {
……
        publicvoid run() {
            synchronized(mLock) {
           
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值