今天复习下线程
线程的方法:
1. sleep()
让调用该方法的线程睡眠指定时间,sleep结束后,线程进入就绪状态,等待拿到CPU执行权后进入运行状态。
调用sleep()方法只是交出CPU执行权并不会让线程释放它所持有的同步锁,而且在这期间它也不会阻碍其它线程的运行。
注意:
线程醒来之后不会马上运行,而要等待cpu给其分配时间片。因此sleep()中指定的时间并不是线程不运行的精确时间!所以不能依赖sleep()方法提供十分精确的定时
2. wait()
当调用了某个对象的wait()方法时,当前运行的线程就会转入WAITING状态,等待别的线程再次调用这个对象的notify()或者notifyAll()方法唤醒它,或者到了指定的最大等待时间,线程自动醒来。如果线程调用了某个对象的wait()方法,这个线程就会释放这个对象所持有的同步资源(不会释放其他对象的同步锁),并交出CPU执行权,进入对象的等待池。
3. join()
join就是阻塞调用线程,直到该线程结束后,调用线程才能继续执行。该影响只存在于执行join方法的线程和调用该线程的线程之间。如在t1线程中调用t2.join(),则需要t2线程执行完后t1方能继续执行。
4. yield()
让当前运行Thread放弃其所占用的cpu时间片,以便让其他Thread运行。用yield()方法的目的是让Thread能适当地轮转。但是,并不能保证达到此效果!因为,即使当前Thread放弃时间片,可是还有可能再次被JVM选中!也就是连任。
5. interrupt()
interrupted方法是查询是否有“中断状态”这一标志,而这一标志很重要很重要。
通常情况下这个标志都是没有被设置的,一旦这个标志被设置了,则所有当前正在阻塞的方法(限定在由于wait、sleep、join三种方法引发的阻塞)都会立刻完成“跳出阻塞状态、抛出InterruptedException异常、清除中断状态标志”这三件工作。仿佛线程在阻塞时,总在不断的查询这一标志,一旦发现这个标志被设置了,那么就立刻发生上述提到的三件工作。不过这只是一种猜测,至于底层到底是如何实现的,我们并不知道。
而我们调用interrupt方法也很有趣,通常这个标志都是未被设置的,一旦调用这个方法,它就会设置这个标志,说白了,这个方法所完成的工作也就仅仅限于设置了一个这样的标志。接下来就能和上一段落中提到的事情相关联了,如果线程当前是阻塞的状态,那么它会利用这个标志啦,然后做“三件事情”,然后这个标志又被清除了;如果线程当前是非阻塞状态,那么该方法的调用也就仅仅是设置一个标志而已,注意设置了这个标记就和没设置这个标记完全不同了,一旦你再想调用sleep等阻塞方法时,它们都会“立刻跳出阻塞状态、抛出异常、清除标记”。
6. isInterrupted()
判断进程是否被中断。
7. Interrupted():
判断进程是否被中断,并唤醒进程(把进程的中断状态设为false)。
8. setDaemon(true)
设置线程为监护线程。
9. isDaemon()
检测和判断某个线程是否为监护线程。
注:sleep 和 yield 方法的区别
sleep 方法使当前运行中的线程睡眼一段时间,进入不可运行状态,这段时间的长短是由程序设定的,yield 方法使当前线程让出 CPU 占有权,但让出的时间是不可设定的。实际上,yield()方法对应了如下操作: 先检测当前是否有相同优先级的线程处于同可运行状态,如有,则把 CPU 的占有权交给此线程,否则,继续运行原来的线程。所以yield()方法称为“退让”,它把运行机会让给了同等优先级的其他线程。
另外,sleep 方法允许较低优先级的线程获得运行机会,但 yield() 方法执行时,当前线程仍处在可运行状态,所以,不可能让出较低优先级的线程些时获得 CPU 占有权。在一个运行系统中,如果较高优先级的线程没有调用 sleep 方法,又没有受到 I\O 阻塞,那么,较低优先级线程只能等待所有较高优先级的线程运行结束,才有机会运行。
分享到:
相关推荐
在Linux平台上用多线程方法实现浮点向量的点积计算: 点积规则可以自己定,程序中采用的是ai=bi=-1/1/0(按3取余运算),另外,计算程序运行时间. 输入格式为: vec_mul thread_num N 参数: thread_num:线程数,从1到...
本科操作系统实验代码,使用多线程编程实现浮点向量的点积计算。
QSerialport多线程方法 使用Qt也已经有一段时间了,虽然使用过继承QThread重写run函数,以及继承QObject然后使用MoveToThread两种方法实现多线程,但是在QSerialPort的使用过程中,两种方法都存在一定的问题。 典型...
SilverLight 多线程方法(new) SilverLight 多线程方法(new) SilverLight 多线程方法(new) SilverLight 多线程方法(new) SilverLight 多线程方法(new) SilverLight 多线程方法(new)
MFC创建用户界面线程方法2:不用AfxBeginThead函数创建,而是采用CreateThread成员函数。演示了3个用户界面线程的相互通信和工作。采用另一种方法传递线程之间的参数。
MFCwithOpenGLWindow-用多线程方法实现在MFC/WIN32中调用OpenGL函数并创建OpenGL窗口源码.
MFCwithOpenGLWindow51-用多线程方法实现在MFC/WIN32中调用OpenGL函数并创建OpenGL窗口源码,增加了glut定时控制显示刷新,可以在MFC中控制GL的绘图。
线程,有时被称为轻量级进程(Lightweight Process,LWP),是程序执行流的最小单元。一个标准的线程由线程ID,当前指令指针(PC),寄存器集合和堆栈组成。另外,线程是进程中的一个实体,是被系统独立调度和分派的...
MFCwithOpenGLWindow-用多线程方法实现在MFC/WIN32中调用OpenGL函数并创建OpenGL窗口源码
编写基于多线程的素数(是除了自身和1以外,没有其它素数因子的自然数)判定程序。待判定的整数经过键盘录入后存放在一个列表中,创建10个线程从列表中取出整数进行判定,判定的结果存入到另一个列表中,用户可以通过...
vc多线程编程详细的讲解和正确的程序代码,对于初学者实用
# 多线程.js//线程暂停//线程停止//定义一个线程//线程开始执行//等待线程执行完闭。