您的位置:首页 > 编程语言

多线程编程 深入理解线程对象和线程

2006-08-15 10:18 567 查看
深入理解线程对象和线程

让我们先以C++来说明,然后我们转到J***A上来,因为c++对对象的销毁更直接一些:
到目前为止,C++还没有直接支持多线程,意思是说多线程不是C++标准库,这也是J***A程序员对于
多线程编程比C++程序更精通一些(这是普通来说的,你不要拿一个C++多线程高手和普通的J***A程
序员比),因为J***A程序从一开始就接收了多线程的思想并不断地训练.

目前最有可能被下一代C++标准采用的多线程库是ZThread,或者我们可以直接用VC的CWinThread来
举例,它们都是标准C++上对线程的扩展实现.

class MyRunnable: public ZThread::Runnable{
public:
void Run(){
for(int i = 0;i< 100000;i++){
//输出;
//sleep;
}
}
~MyRunnable(){}
}

for(int i = 0;i< 10;i++){
Thread zt(new MyRunnable());
}
我们非常清楚地看到,在C++中,循环内的变量在跳出循环后,就会被直接从栈中自动销毁,但是线程却
实实在在地在工作.

这在理论上与C++是相悖的,一个对象本身已经从栈中退出,那么如何运行它的代码?
如果我一开始用J***A来举例,你可能会说虽然对象跳出了循环但它还在垃圾回收器中,等到线程执行
完成后才被回收.但我们用C++来说明,基于栈的变量zt每次跳出循环就一定被从栈中销毁,那么线程
又如果运行下去呢?

这正是我在之前一直强调的两个概念,线程对象和线程的区别.一个线程对象,在开始运行的时候(J***A
中从调用线程对象的start(),ZThread中构造函数完成后会直接启动),就将当前线程所要执行的任务
及相关上下文注册到线程处理系统内.线程对象只是向这个处理系统注册的句柄,注册后如何执行线程
对象要完成的操作那就由线程处理系统来统一管理了,这里线程对象已经完成了它的使命,无论是直接
从栈中销毁还是直接被垃圾回收器回收,还是继续存放在原来的内存位置,都不影响线程处理系统来处
理要完成的操作.
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: