今天复习下线程
线程的方法:
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到...
本科操作系统实验代码,使用多线程编程实现浮点向量的点积计算。
标题提到的“MFC创建用户界面线程方法2”指的是不依赖于`AfxBeginThread`函数,而是使用`CreateThread`系统API来创建线程。这种方法虽然更加底层,但提供了更大的灵活性。 `AfxBeginThread`是MFC提供的一个方便的...
总结起来,"用多线程方法实现在MFC中调用控制OpenGL绘图"涉及到的知识点包括:MFC编程基础、OpenGL绘图原理、多线程编程、GLUT库的使用、线程间通信和同步、以及Windows消息机制。掌握这些技能,开发者就能创建出...
工控软件流程控制多线程方法调用
本篇文章将详细阐述VC++中实现多线程的三种常见方法:使用`CreateThread`函数、`_beginthread`/`_beginthreadex`函数以及基于`std::thread`的C++11标准库方法。 1. **使用CreateThread函数** Windows API提供的`...
在实际编程中,理解并熟练掌握这些线程方法对于编写高效的并发程序至关重要。例如,`synchronized`关键字用于保证共享数据的线程安全性,避免数据竞争。当多个线程尝试访问同一共享资源时,`synchronized`可以确保...
Java多线程编程安全退出线程方法介绍 Java多线程编程安全退出线程方法的重要性在于确保线程的资源正确释放,避免程序工作在不确定的状态下。以下是Java多线程编程安全退出线程方法的知识点: 1. Thread.stop()方法...
编写基于多线程的素数(是除了自身和1以外,没有其它素数因子的自然数)判定程序。待判定的整数经过键盘录入后存放在一个列表中,创建10个线程从列表中取出整数进行判定,判定的结果存入到另一个列表中,用户可以通过...
- 继承`Thread`类:自定义一个类继承`Thread`,重写`run()`方法,然后实例化并调用`start()`方法启动线程。 - 实现`Runnable`接口:创建一个实现了`Runnable`接口的类,重写`run()`方法,然后将`Runnable`对象传递...
这里,`WorkerMethod`是你的工作线程方法,执行实际的任务。 对于停止线程的按钮,我们需要一种机制来中断正在运行的线程。由于C#线程不直接支持“停止”操作,我们通常使用取消标志或共享变量来指示线程何时应停止...
本示例着重讲解几个关键的线程方法,包括`Abort`,`Join`,`Sleep`,`Interrupt`以及`Start`,这些都是在实际开发中频繁使用的功能。 1. **Start方法**: `Thread.Start`方法用于启动新创建的线程。当你创建了一个...
# 多线程.js//线程暂停//线程停止//定义一个线程//线程开始执行//等待线程执行完闭。
4. **线程方法**:TestMethod1、TestMethod2和TestMethod3是三个线程执行的方法。这些方法通常包含循环,用于向输出设备(如控制台或日志文件)写入数据。每个方法在各自的线程中独立运行,可以实现并行输出。 5. *...
2. **使用委托**:可以将线程方法作为委托传递给`Thread`类。 ```csharp Thread newThread = new Thread(new ThreadStart(YourDelegateMethod)); newThread.Start(); ``` #### 三、线程的状态 线程在其生命周期...
- **ThreadStart**:这是一种创建线程的方法,适用于没有参数的线程方法。可以通过创建Thread实例并传递一个ThreadStart委托给它的Start方法来启动一个新的线程。 ```csharp Thread thread = new Thread(new Thread...
在多线程中,有时候使用MessageBox.Show方法弹出对话框,弹出的Messagebox不是模态的,不能满足我的要求.所以有了这段代码.