美文网首页
Java基础知识11-多线程3

Java基础知识11-多线程3

作者: 我相信你爱过gg | 来源:发表于2017-02-01 21:00 被阅读13次
    配图

    线程调度

    线程调度程序根据线程优先级决定每个线程应当何时运行。理论上,优先级更高的线程比优先级更低的线程会获得更多的CPU时间。实际上,线程得到的CPU时间除了依赖于优先级外,通常还依赖于其他几个因素(例如,操作系统实现多任务的方式可以会影响CPU时间的相对可用性)。

    具有更高优先级的线程还可能取代更低优先级的线程。例如,当一个低优先级的线程运行时,需要恢复一个更高优先级的线程(例如,从休眠或等待I/O中恢复)时,高优先级的线程将取代低优先级的线程。

    理论上,具有相同优先级的线程应当得到相等的CPU时间。但是,java被设计在范围广泛的环境种运行。有些环境实现多任务的方式与其他环境不同。为了安全起见,具有相同优先级的线程应当时不时释放控制权。这样可以确保所有线程在非抢占式操作系统中有机会运行。

    实际上,即使是在非抢占式环境中,大部分线程仍有机会运行,因为大部分线程不可避免的会遇到一些阻塞情况,例如I/O等待。

    发生这种情况时,阻塞的线程被挂起,其他线程就可以运行。但是,如果希望平滑多个线程执行,最好不要依赖于这种情况。此外,某些类型的任务是CPU密集型的。这种线程会支配CPU。对于这类线程,要经常释放控制权,以使其他线程能够运行。

    线程两种调度模型

    1.分时调度模型
    所有线程轮流使用CPU的控制权,平均分配CPU的占用时间。
    2.抢占式调度模型
    优先让优先级更高的线程使用CPU,如果线程的优先级相同,那么会随机选择一个,优先级高的线程获取的时间会多一些

    java使用的是抢占式调度模型。

    设置优先级

    public final void setPriority(int newPriority)
    

    参数:newPriority取值范围为1-10。

    线程休眠

    try {
         Thread.sleep(10);//以毫秒为单位。10毫秒
    } catch (InterruptedException e) {
          e.printStackTrace();
    }
    

    sleep()属于静态方法,可以直接使用类名调用。

    等待指定线程终止

    ThreadJoin tj = new ThreadJoin();
    Thread thread = new Thread(tj, "tj");
    try {
        thread.join();
    } catch (InterruptedException e) {
        e.printStackTrace();
    }
    

    join()方法会一直等待tj线程的结束,当tj线程执行完毕后才会继续往下执行。
    也可以使用isAlive()方法来判断一个线程是否执行完成,如果线程在运行则返回true,否则返回false。

    守护线程(后台线程)

    public final void setDaemon(boolean on)
    

    将该线程标记为守护线程或用户线程。当正在运行的线程都是守护线程时,Java 虚拟机退出。 该方法必须在启动线程前调用。
    简单理解为,主线程结束时,守护线程同时结束。设置true为守护线程。

    线程中断

    线程中断的两种方式

    public final void stop()
    public void interrupt()
    

    区别
    stop()让线程停止。
    interrupt()中断线程。将线程状态终止。并跑出InterruptedException异常。

    线程生命周期

    线程生命周期

    相关文章

      网友评论

          本文标题:Java基础知识11-多线程3

          本文链接:https://www.haomeiwen.com/subject/yyhsvttx.html