㈠ 线程进入阻塞时,线程会不会让出CPU
那要看操作系统context switch的机制。
一般windows linux ios都会给定每个线程指定的执行时间,如果时间到了会出现计时器中断信号(timer interrupt signal),而线程会被动丢失CPU的使用权。
而有些简单的嵌入式系统没有这个机制,context switch一般是要求线程主动放弃CPU使用权而交给kernel。如果这时候当前线程被阻塞那就会导致死循环,这时候要主动的叫reschele 或者 yield等函数给kernel发信号。
当然有timer的系统也可以叫这些函数要当前线程提早主动放弃CPU资源从而避免在循环里等待浪费时间。
㈡ 如何在线程中途让出 cpu 使用权
线程调度 计算机通常只有一个CPU,在任意时刻只能执行一条机器指令,每个线程只有获得CPU的使用权才能执行指令.所谓多线程的并发运行,其实是指从宏观上看,各个线程轮流获得CPU的使用权,分别执行各自的任务.在运行池中,会有多个处于就绪状态的线程
㈢ Java线程的问题
main方法启动程序后是运行在一个线程,你自己再创建两个线程,做各自的任务,“结果不依赖当前CPU资源”这句话在这个上下文中的意思应该是指的不依赖运行程序所在的主线程。
㈣ 线程如何主动放弃CPU
1.如果只是想放弃当前线程的CPU时间片,可以用Sleep和SwitchToThread
1)线程可以调用Sleep函数使其在指定时间内不被调度:
VOID Sleep(DWORD dwMilliseconds);
Sleep调用会挂起当前线程,dwMilliseconds毫秒之后再将其恢复为可调度的。
Sleep函数有以下几点值得注意:
a) 因为Windows并不是一个实时系统,dwMilliseconds只是一个建议值,因此Sleep调用时,系统挂起当前线程的时长大约是dwMilliseconds毫秒。比如,当dwMilliseconds设置为100时,在大多数情况下,当前线程睡眠的时长并不会是100ms,可能是几百毫秒、几秒、几分钟等等。
b) dwMilliseconds=INFINITE(-1)会使当前线程永远睡眠,这通常没什么用处。
c) dwMilliseconds=0时,当前线程会放弃剩余的时间片,系统会尝试调度优先级等于或高于当前线程 的可调度线程,如果没有找到这样的线程,系统将马上重新调度调用Sleep的线程。
2)SwitchToThread 当前线程可以调用SwitchToThread强迫操作系统调度另外的可调度线程(如果存在)。
BOOL SwitchToThread();
当前线程调用SwitchToThread时,系统会检查是否存在可调度的线程处于“饥饿”状态,如果没有找到,SwitchToThread立刻返回,系统继续执行当前线程,否则系统将暂停当前线程并调度处于“饥饿”状态的线程(无论该线程的优先级大小),“饥饿”线程的调度时间大约是一个时间片,然后系统调度将恢复正常。
当线程A需要获得某资源,而该资源又被另一优先级较低的线程B占用时,A可以调用SwitchToThread迫使操作系统调度低先级的进程,以期待B释放被占用的资源。当没有其它线程可调度时,SwitchToThread返回FALSE,否则返回一个非0值。
SwitchToThread使用可参考http://hi..com/alizx/blog/item/1bd7468e6e1975e5f01f3601.html
SwitchToThread函数和Sleep(0)调用类似,不同之处在于SwitchToThread允许系统调度优先级低于当前线程的可调度线程,但Sleep(0)只允许调度优先级不低于当前线程的可调度线程。
2.上述两个函数只是在当前调度内放弃CPU时间,如果你是要根据条件查询的结果决定是否放弃时,可以采用
while(条件){Sleep(0);}
或while(条件){SwitchToThread();}
3.如果不想通过查询的方式,可以采用异步通知的方式。比如调用WaitForSingleObject某一事件(Event)这样的阻塞函数,等待被置信。该函数首先在用户空间检查是否被置信。如果不是,则进入内核态放弃当前线程的CPU时间片,然后等待被外部置信;也可以直接SuspendThread自身,等待外部唤醒,原理和WaitForSingleObject类似。
4.如果想永久放弃时间片,可以让线程结束,直接return 0;
㈤ 如何实现Java线程的暂停和重新启用
JAVA中线程开始有start方法,暂停用sleep(time)方法,线程停止用stop方法,线程等待wait方法,java 中没有线程重启一说,只能说线程唤醒notifyAll()或是notify方法,前一个notifyAll()方法是唤醒所有的已休眠或是等待状态下的线程。具体的一种参数请参照JDK文档。
㈥ 基于java 线程的几种状态
下面是java 线程的5种状态:
1、新建(new)
新建一个线程的对象。
2、可运行(runable)
线程对象创建后,其他线程调用该线程的start方法。或者该线程位于可运行线程池中等待被线程调用,已获取cpu的使用权。
3、运行(running)
可运行的线程获取了cpu的使用权,执行程序代码
4、阻塞(block)
由于某些原因该线程放弃了cpu的使用权。停止执行。除非线程进入可运行的状态,才会有机会获取cpu的使用权。
(1)等待阻塞:运行中的线程执行wait方法,这时候该线程会被放入等待队列。
(2)同步阻塞:运行中的线程获取同步锁,如果该同步锁被别的线程占用,这个线程会成被放入锁池,等待其他线程释放同步锁。
(3)其他阻塞:运行的线程执行sleep或者join方法这个线程会成为阻塞状态。当sleep超时,join等待线程终止,该线程会进入可运行状态。
5、死亡(dead)
线程run mian 执行完毕后,或者因为某些异常产生退出了 run 方法,该线程的生命周期结束。
㈦ 多线程那里太难 你们是怎么学会的
并发需要用多线程实现。
web开发一般是不用多线程,不过个别特殊的功能可能要用。
因为yield只是使当前线程放弃cpu使用权。wait()方法会使当前线程放弃持有的锁。
比较好的方法是用wait() notify()机制,但并不放锁这种操作不好。
这有可能造成潜在的死锁 - 当前线程占用了锁却不运行,其他线程想运行却拿不到锁,也就是说在当前线程重新回到CPU上运行之前,其他线程都不能使用increment方法
这种操作不好。因为yield只是使当前线程放弃cpu使用权,但并不放锁,也就是说在当前线程重新回到CPU上运行之前,其他线程都不能使用increment方法。 这有可能造成潜在的死锁 - 当前线程占用了锁却不运行,其他线程想运行却拿不到锁。 比较好的
在初学java时可以看javascript入门经典,之后你觉得基础可以了就看javascript高级编程吧
㈧ 下面哪个方法使线程从运行状态到阻塞状态,但是不让出资源
线程调度 计算机通CPU,任意刻能执行条机器指令每线程获CPU使用权才能执行指令
所谓线程并发运行其实指宏观看各线程轮流获CPU使用权别执行各自任务
运行池处于绪状态线程等待CPU,JAVA虚拟机项任务负责线程调度线程调度指按照特定机制线程配CPU使用权
两种调度模型:调度模型抢占式调度模型
调度模型指让所线程轮流获cpu使用权并且平均配每线程占用CPU间片比较理解
java虚拟机采用抢占式调度模型指优先让运行池优先级高线程占用CPU运行池线程优先级相同随机选择线程使其占用CPU
处于运行状态线程直运行直至放弃CPU
线程原放弃CPU
1 java虚拟机让前线程暂放弃CPU转绪状态使其线程或者运行机
2 前线程某些原进入阻塞状态 3 线程结束运行 需要注意线程调度跨平台 仅仅取决于java虚拟机依赖于操作系统
某些操作系统要运行线程没遇阻塞放弃CPU;
某些操作系统即使线程没遇阻塞运行段间放弃CPU给其线程运行机
java线程调度同启线程能保证各线程轮流获均等CPU间片
希望明确让线程给另外线程运行机采取办
调整各线程优先级 让处于运行状态线程调用Thread.sleep() 让处于运行状态线程调用Thread.yield() 让处于运行状态线程调用另线程join()
㈨ java多线程有几种状态
新建(new)
新建一个线程的对象。
可运行(runable)
线程对象创建后,其他线程调用该线程的start方法。或者该线程位于可运行线程池中等待被线程调用,已获取cpu的使用权。
运行(running)
可运行的线程获取了cpu的使用权,执行程序代码/
阻塞(block)
由于某些原因该线程放弃了cpu的使用权。停止执行。除非线程进入可运行的状态,才会有机会获取cpu的使用权。
1. 等待阻塞:运行中的线程执行wait方法,这时候该线程会被放入等待队列。
2. 同步阻塞:运行中的线程获取同步锁,如果该同步锁被别的线程占用,这个线程会成被放入锁池,等待其他线程释放同步锁。
3. 其他阻塞:运行的线程执行sleep或者join方法这个线程会成为阻塞状态。当sleep超时,join等待线程终止,该线程会进入可运行状态。
死亡(dead)
线程run mian 执行完毕后,或者因为某些异常产生退出了 run 方法,该线程的生命周期结束。