`

Thread 代码 wait sleep 区别

阅读更多
public class ThreadTest {
    int a;
    private boolean _maintenanceThreadStarted = true;

    public void task() {
        System.out.println(++a + "  " + Thread.currentThread().getId());
    }

    public void startThread() {
        (new Thread() {
            public void run() {
                while (_maintenanceThreadStarted) {
                    task();
                    try {
                        Thread.sleep(100);
                    } catch (InterruptedException ex) {
                        ex.printStackTrace();
                    }
                }
            }
        }).start();
    }

    public void startServiceThread() {
        Runnable r = new Runnable() {
            public void run() {
                while (_maintenanceThreadStarted) {
                    task();
                    if (a > 100) {
                        _maintenanceThreadStarted = false;
                    }
                    try {
                        Thread.sleep(100);
                    } catch (InterruptedException ex) {
                        ex.printStackTrace();
                    }
                }
            }
        };
        Thread _serviceThread = new Thread(r, "SessionPoolServer-RequestServiceThread");
        _serviceThread.start();
    }

    public void stopMaintenanceThread() {
        _maintenanceThreadStarted = false;
    }

    public static void main(String[] args) throws Exception {
        ThreadTest a = new ThreadTest();
        a.startThread();
        new ThreadTest().startServiceThread();
        Thread.sleep(5000);
        a.stopMaintenanceThread();
        System.out.println("end");
    }

}

 

 

 

从操作系统的角度讲,os会维护一个ready queue(就绪的线程队列)。并且在某一时刻cpu只为ready queue中位于队列头部的线程服务。
但是当前正在被服务的线程可能觉得cpu的服务质量不够好,于是提前退出,这就是yield。
或者当前正在被服务的线程需要睡一会,醒来后继续被服务,这就是sleep。

sleep方法不推荐使用,可用wait。
线程退出最好自己实现,在运行状态中一直检验一个状态,如果这个状态为真,就一直运行,如果外界更改了这个状态变量,那么线程就停止运行。

sleep()使当前线程进入停滞状态,所以执行sleep()的线程在指定的时间内肯定不会执行;yield()只是使当前线程重新回到可执行状态,所以执行yield()的线程有可能在进入到可执行状态后马上又被执行。
sleep()可使优先级低的线程得到执行的机会,当然也可以让同优先级和高优先级的线程有执行的机会;yield()只能使同优先级的线程有执行的机会。

当调用wait()后,线程会释放掉它所占有的“锁标志”,从而使线程所在对象中的其它synchronized数据可被别的线程使用。

waite()和notify()因为会对对象的“锁标志”进行操作,所以它们必须在synchronized函数或synchronized block中进行调用。如果在non-synchronized函数或non-synchronized block中进行调用,虽然能编译通过,但在运行时会发生IllegalMonitorStateException的异常。

 

 

 

 

. wait()、notify()、notifyAll()和suspend()、resume()、sleep()的讨论
4.1 这两组函数的区别
1) wait()使当前线程进入停滞状态时,还会释放当前线程所占有的“锁标志”,从而使线程对象中的synchronized资源可被对象中别的线程使用;而suspend()和sleep()使当前线程进入停滞状态时不会释放当前线程所占有的“锁标志”。
2) 前一组函数必须在synchronized函数或synchronized block中调用,否则在运行时会产生错误;而后一组函数可以non-synchronized函数和synchronized block中调用。
4.2 这两组函数的取舍
Java2已不建议使用后一组函数。因为在调用sleep()时不会释放当前线程所取得的“锁标志”,这样很容易造成“死锁”。

 

分享到:
评论

相关推荐

    C#中sleep和wait的区别分析

    主要介绍了C#中sleep和wait的区别分析,有助于深入理解C#中线程的原理与使用技巧,非常具有实用价值,需要的朋友可以参考下

    sleep()、wait()、yield()和join()方法特点及区别.docx

    sleep()与wait()的区别 1.这两个方法来自不同的类,sleep是Thread类的方法,而wait是Object类的方法; 2.执行sleep方法后不会释放锁,而执行wait方法后会释放锁; 3.wait,notify和notifyAll只能在同步方法或同步...

    线程中sleep、join、yield、wait的区别

    给出一段准备代码,相信各位一看就懂,不懂,你不懂那我不能揍你呀。 ThreadTest: package hsy.cool.threadJY; /** * 项目准备 * @author 爱猫狗的小郝_河南济源追梦孩 */ public class ThreadTest extends ...

    Jungle68#-#wait()和sleep()的区别1

    sleep是Thread的静态类方法,谁调用的谁去睡觉,即使在a线程里调用b的sleep方法,实际上还是a去睡觉,要让b线程睡觉要在b的代码中调用sleep。一

    JVM线程状态和Thread.sleep的实现原理探究.pdf

    jvm线程生命周期以及线程的状态切换,探究sleep和唤醒的原理。

    jstack生成的Thread Dump日志.docx

    "Wait Set"中的线程在Thread Dump中显示的状态为 in Object.wait()。通常来说, 通常来说,当CPU很忙的时候关注 Runnable 状态的线程,反之则关注 waiting for monitor entry 状态的线程。 JVM线程运行状态 ...

    100家大公司java笔试题汇总

    sleep() 和 wait() 有什么区别? (网上的答案:sleep是线程类(Thread)的方法,导致此线程暂停执行指定时间,给执行机会给其他线程,但是监控状态依然保持,到时后会自动恢复。调用sleep不会释放对象锁。 wait是...

    java多线程示例

    Java中的多线程有三种实现方式: 1.继承Thread类,重写run方法。Thread本质上也是一个实现了Runnable的实例,他代表一个线程的实例,并且启动线程的唯一方法就是通过Thread...本示例演示和wait和sleep、线程锁的使用。

    vcmianshi.rar_c++ thread_算法笔试面试_算法面试题_马戏团

    pdf,相关内容:字符串匹配的KMP算法,括号匹配检测、求一个数组的最长递减字序列、一些数字题求解,输出一个字符串的所有组合,马戏团表演问题、Thread.sleep 与obj.wait时,线程状态有什么区别?将一个数组转换...

    j2me手机蓝牙OBEX传文件代码

    Thread.sleep(5000); t.setString(rd.getFriendlyName(true)); Thread.sleep(5000); disc_agent.searchServices(null, u,rd, serv_listener); serv_listener.wait(); } 4.从搜索到的ServiceRecord 中取出连接...

    在同步代码结束后,使用ReleaseMutex(THandle

    三、还有一种用信号量对象来管理线程同步的,它是在互斥的基础上建立的,但信号量增加了资源计数的功能,预定数目的线程允许同时进入要同步的代码。有点复杂,想不到在哪可以用,现在就不研究论了。 发表于 @ 2008...

    ThreadStateProject

    thread state test project 1.对比java中的sleep()和wait()的区别 2.等待调用join方法的线程结束,再继续执行

    thread count

    Thread.sleep((long)(Math.random()*100)); //随机分配时间,即运动员完成时间 System.out.println("Play"+id+" arrived."); }catch (InterruptedException e) { // TODO: handle exception e.printStackTrace...

    java用线程两种方式

    * 继承Thread:线程代码存放Thread子类run方法中 实现 * Runnable:线程代码存放接口的子类的run方法 * wait释放资源,释放锁 * sleep释放资源,不释放锁 */ @SuppressWarnings("all") public class Thread1 { ...

    消费者生产者模型 c++

    wait_for_all = WaitForMultipleObjects(n_Thread,h_Thread,TRUE,-1); printf(" \n \nALL Producer and consumer have finished their work. \n"); printf("Press any key to quit!\n"); _getch(); return 0; ...

    WPFTask测试

    代码很简单,只是基本的应用, //基本创建方式,手动启动Task Task t1 = new Task(SleepFun); Console.WriteLine("t1 Status: {0}... Thread.Sleep(3000); Console.WriteLine("t1 Status: {0}", t1.Status); } );

    高级开发并发面试题和答案.pdf

    Thread.sleep()和LockSupport.park()的区别 Object.wait()和LockSupport.park()的区别 线程和线程池 线程池的五种状态 线程池类型 线程池原理 线程池构造函数参数; 线程池的4种拒绝策略; 线程池中任务结束后会不会...

    线程学习小Test

    Java线程 wait notify sleep join 同步实现Demo

    Java中停止线程执行的方法

    对于把线程转入睡眠Sleep状态,使用Thread.sleep()是最正确的方式。或许有人会问,为什么不使用等待wait()或通知notify()?要知道,使用等待或通知都不是很好的方式。 线程可以使用等待wait()实现被阻塞,这属于条件...

Global site tag (gtag.js) - Google Analytics