sleep线程醒不过来(死锁线程只要等到sleep)

http://www.itjxue.com  2023-01-30 13:37  来源:未知  点击次数: 

.net中Thread.sleep(120000)不能唤醒问题:代码如下:

最大的可能性还是 currThreadTime 这个变量的值 到sleep那里的时候是不是60 FileLog.WriteLog里面有没有修改currThreadTime的值 其它线程有没有修改它

这个要自己检查你的程序

不要把问题点集中在不能唤醒上,要仔细检查程序的其它部分

java中我让一个线程sleep(100000),时间没到可以有什么方法使它立即从睡眠中醒过来吗

看下api的文档就知道了啦,如果是用sleep方法的话,应该用interupt方法唤醒,不过这个方法在1.6之后被建议不再使用了

线程中sleep和wait的区别

线程中sleep和wait的区别如下:

一,首先二者的不同点:

1.这两个方法来自不同的类分别是Thread和Object。首先对于sleep()方法,要知道该方法是属于Thread类中的。而wait()方法,则是属于Object类中的。

2.sleep()方法导致了程序暂停执行指定的时间,让出cpu该其他线程,但是他的监控状态依然保持者,当指定的时间到了又会自动恢复运行状态。在调用sleep()方法的过程中,线程不会释放对象锁。而当调用wait()方法的时候,线程会放弃对象锁,进入等待此对象的等待锁定池,只有针对此对象调用notify()方法后本线程才进入对象锁定池准备。获取对象锁进入运行状态。

3.最主要是sleep方法没有释放锁,而wait方法释放了锁,使得其他线程可以使用同步控制块或者方法。wait,notify和notifyAll只能在同步控制方法或者同步控制块里面使用,而sleep可以在任何地方使用(使用范围)

比如:

synchronized(x){

x.notify()

//或者wait()

}

4.sleep必须捕获异常,而wait,notify和notifyAll不需要捕获异常

举例说明如下:

1.首先我们先看sleep中的构造函数

sleep(long millis) Causes the currently executing thread to sleep (temporarily cease execution) for the specified number of milliseconds, subject to the precision and accuracy of system timers and schedulers.

sleep(long millis, int nanos) Causes the currently executing thread to sleep (cease execution) for the specified number of milliseconds plus the specified number of nanoseconds, subject to the precision and accuracy of system timers and schedulers.

sleep方法属于Thread类中方法,表示让一个线程进入睡眠状态,等待一定的时间之后,自动醒来进入到可运行状态,不会马上进入运行状态,因为线程调度机制恢复线程的运行也需要时间,一个线程对象调用了sleep方法之后,并不会释放他所持有的所有对象锁,所以也就不会影响其他进程对象的运行。但在sleep的过程中过程中有可能被其他对象调用它的interrupt(),产生InterruptedException异常,如果你的程序不捕获这个异常,线程就会异常终止,进入TERMINATED状态,如果你的程序捕获了这个异常,那么程序就会继续执行catch语句块(可能还有finally语句块)以及以后的代码。

另外注意sleep()方法是一个静态方法,也就是说他只对当前对象有效,通过t.sleep()让t对象进入sleep,这样的做法是错误的,它只会是使当前线程被sleep 而不是t线程

2.wait方法

void wait(long timeout)

Causes the current thread to wait until either another thread invokes the notify() method or the notifyAll() method for this object, or a specified amount of time has elapsed.

void wait(long timeout, int nanos)

Causes the current thread to wait until another thread invokes the notify() method or the notifyAll() method for this object, or some other thread interrupts the current thread, or a certain amount of real time has elapsed.

wait属于Object的成员方法,一旦一个对象调用了wait方法,必须要采用notify()和notifyAll()方法唤醒该进程;如果线程拥有某个或某些对象的同步锁,那么在调用了wait()后,这个线程就会释放它持有的所有同步资源,而不限于这个被调用了wait()方法的对象。wait()方法也同样会在wait的过程中有可能被其他对象调用interrupt()方法而产生

InterruptedException,效果以及处理方式同sleep()方法

二,最后二者的共同点:

1. 他们都是在多线程的环境下,都可以在程序的调用处阻塞指定的毫秒数,并返回。

2. wait()和sleep()都可以通过interrupt()方法 打断线程的暂停状态 ,从而使线程立刻抛出InterruptedException。

如果线程A希望立即结束线程B,则可以对线程B对应的Thread实例调用interrupt方法。如果此刻线程B正在wait/sleep /join,则线程B会立刻抛出InterruptedException,在catch() {} 中直接return即可安全地结束线程。

需要注意的是,InterruptedException是线程自己从内部抛出的,并不是interrupt()方法抛出的。对某一线程调用 interrupt()时,如果该线程正在执行普通的代码,那么该线程根本就不会抛出InterruptedException。但是,一旦该线程进入到 wait()/sleep()/join()后,就会立刻抛出InterruptedException 。

以上就是线程中sleep和wait的区别。

程序sleep太久了是不是就不会唤醒了

一般不会,但是如果sleep设在主线程中,在sleep期间,软件没有任何响应。像是死机一样。

如何让线程阻塞,如何唤醒线程,说说不同的唤醒线程方法的区别

sleep() 方法:

sleep(…毫秒),指定以毫秒为单位的时间,使线程在该时间内进入线程阻塞状态,期间得不到cpu的时间片,等到时间过去了,线程重新进入可执行状态。(暂停线程,不会释放锁)

suspend() 和 resume() 方法:。

挂起和唤醒线程,suspend()使线程进入阻塞状态,只有对应的resume()被调用的时候,线程才会进入可执行状态。(不建议用,容易发生死锁)

yield() 方法:

会使的线程放弃当前分得的cpu时间片,但此时线程任然处于可执行状态,随时可以再次分得cpu时间片。yield()方法只能使同优先级的线程有执行的机会。调用 yield() 的效果等价于调度程序认为该线程已执行了足够的时间从而转到另一个线程。(暂停当前正在执行的线程,并执行其他线程,且让出的时间不可知)

wait() 和 notify() 方法:

两个方法搭配使用,wait()使线程进入阻塞状态,调用notify()时,线程进入可执行状态。wait()内可加或不加参数,加参数时是以毫秒为单位,当到了指定时间或调用notify()方法时,进入可执行状态。(属于Object类,而不属于Thread类,wait( )会先释放锁住的对象,然后再执行等待的动作。由于wait( )所等待的对象必须先锁住,因此,它只能用在同步化程序段或者同步化方法内,否则,会抛出异常IllegalMonitorStateException.)

join()方法

也叫线程加入。是当前线程A调用另一个线程B的join()方法,当前线程转A入阻塞状态,直到线程B运行结束,线程A才由阻塞状态转为可执行状态。

(责任编辑:IT教学网)

更多

相关MYSQL文章

推荐MYSQL文章