多线程学习(五)线程的调度-休眠&优先级

转载 2016年05月31日 15:15:42

转自:http://lavasoft.blog.51cto.com/62575/221790

Java线程:线程的调度-休眠

Java线程调度是Java多线程的核心,只有良好的调度,才能充分发挥系统的性能,提高程序的执行效率。
这里要明确的一点,不管程序员怎么编写调度,只能最大限度的影响线程执行的次序,而不能做到精准控制。
线程休眠的目的是使线程让出CPU的最简单的做法之一,线程休眠时候,会将CPU资源交给其他线程,以便能轮换执行,当休眠一定时间后,线程会苏醒,进入准备状态等待执行。
 
线程休眠的方法是Thread.sleep(long millis) 和Thread.sleep(long millis, int nanos) ,均为静态方法,那调用sleep休眠的哪个线程呢?简单说,哪个线程调用sleep,就休眠哪个线程。
 
/** 
* Java线程:线程的调度-休眠 

* @author leizhimin 2009-11-4 9:02:40 
*/
 
public class Test { 
        public static void main(String[] args) { 
                Thread t1 = new MyThread1(); 
                Thread t2 = new Thread(new MyRunnable()); 
                t1.start(); 
                t2.start(); 
        } 


class MyThread1 extends Thread { 
        public void run() { 
                for (int i = 0; i < 3; i++) { 
                        System.out.println("线程1第" + i + "次执行!"); 
                        try { 
                                Thread.sleep(50); 
                        } catch (InterruptedException e) { 
                                e.printStackTrace(); 
                        } 
                } 
        } 


class MyRunnable implements Runnable { 
        public void run() { 
                for (int i = 0; i < 3; i++) { 
                        System.out.println("线程2第" + i + "次执行!"); 
                        try { 
                                Thread.sleep(50); 
                        } catch (InterruptedException e) { 
                                e.printStackTrace(); 
                        } 
                } 
        } 
}
 
线程2第0次执行! 
线程1第0次执行! 
线程1第1次执行! 
线程2第1次执行! 
线程1第2次执行! 
线程2第2次执行! 

Process finished with exit code 0
 
从上面的结果输出可以看出,无法精准保证线程执行次序。

Java线程:线程的调度-优先级 

与线程休眠类似,线程的优先级仍然无法保障线程的执行次序。只不过,优先级高的线程获取CPU资源的概率较大,优先级低的并非没机会执行。 
线程的优先级用1-10之间的整数表示,数值越大优先级越高,默认的优先级为5。 
在一个线程中开启另外一个新线程,则新开线程称为该线程的子线程,子线程初始优先级与父线程相同。
 
/** 
* Java线程:线程的调度-优先级 

* @author leizhimin 2009-11-4 9:02:40 
*/
 
public class Test { 
        public static void main(String[] args) { 
                Thread t1 = new MyThread1(); 
                Thread t2 = new Thread(new MyRunnable()); 
                t1.setPriority(10); 
                t2.setPriority(1); 

                t2.start(); 
                t1.start(); 
        } 


class MyThread1 extends Thread { 
        public void run() { 
                for (int i = 0; i < 10; i++) { 
                        System.out.println("线程1第" + i + "次执行!"); 
                        try { 
                                Thread.sleep(100); 
                        } catch (InterruptedException e) { 
                                e.printStackTrace(); 
                        } 
                } 
        } 


class MyRunnable implements Runnable { 
        public void run() { 
                for (int i = 0; i < 10; i++) { 
                        System.out.println("线程2第" + i + "次执行!"); 
                        try { 
                                Thread.sleep(100); 
                        } catch (InterruptedException e) { 
                                e.printStackTrace(); 
                        } 
                } 
        } 
}
 
线程1第0次执行! 
线程2第0次执行! 
线程2第1次执行! 
线程1第1次执行! 
线程2第2次执行! 
线程1第2次执行! 
线程1第3次执行! 
线程2第3次执行! 
线程2第4次执行! 
线程1第4次执行! 
线程1第5次执行! 
线程2第5次执行! 
线程1第6次执行! 
线程2第6次执行! 
线程1第7次执行! 
线程2第7次执行! 
线程1第8次执行! 
线程2第8次执行! 
线程1第9次执行! 
线程2第9次执行! 


线程概述,优先级,睡眠,创建及终止(VC_Win32)

目录 线程概述 线程内幕 线程相关函数详解 线程创建 线程睡眠(CPU时间片分配方式) 线程的优先级 线程的终止 线程同步 (本章节中例子都是用 VS2005 编译调试的) 线程概述 组成...
  • zhang_sinner
  • zhang_sinner
  • 2015年01月27日 15:25
  • 558

线程的调度,优先级

抢占式操作系统必须使用某种算法来确定哪些线程应该在何时调度和运行多长时间。     Windows被称为抢占式多线程操作系统,因为一个线程可以随时停止运行 ,随后另一个线程可进行调度。 暂停和运行...
  • luojian5900339
  • luojian5900339
  • 2014年11月11日 15:02
  • 689

Linux 线程调度与优先级设置

转载:http://blog.csdn.net/a_ran/article/details/43759729    线程调度间的上下文切换 什么是上下文切换? 如果主线程是唯一的线程,那么他基本上不会...
  • yyxyong
  • yyxyong
  • 2017年03月17日 18:47
  • 1002

【C#.37】多线程中的Sleep以及子线程优先级

继续上篇,其实在写文章的过程中真的实践了不少,而且发现和自己原来认为的有挺多不同的。因此有错误的话请多指正。以下的内容都是经过试验得出的: using System; using Syste...
  • huiwuhuiwu
  • huiwuhuiwu
  • 2016年12月11日 14:00
  • 3271

Java多线程 之 Callable sleep yield 优先级(三)

1.Callable通过Runnable接口定义的任务其run方法没有返回值。要想获得返回值,需要通过Callable接口来定义任务,其call方法可以有返回值。而且,Callable任务只能通过 E...
  • fan2012huan
  • fan2012huan
  • 2016年06月02日 21:44
  • 824

Java多线程的调度策略

在Java多线程环境中,为保证所有线程的执行能按照一定的规则执行,JVM实现了一个线程调度器,它定义了线程调度的策略,对于CPU运算的分配都进行了规定,按照这些特定的机制为多个线程分配CPU的使用权。...
  • wangyangzhizhou
  • wangyangzhizhou
  • 2014年11月14日 20:22
  • 8684

Quartz 线程处理

http://my.oschina.net/blueskyer/blog/325812 Quartz定时任务默认都是并发执行的,不会等待上一次任务执行完毕,只要间隔时间到就会执行, 如果定时...
  • mituan1234567
  • mituan1234567
  • 2016年05月30日 10:49
  • 741

线程简介和线程优先级

1.线程 线程:又称轻量级进程,是现代操作系统的最小调度单元。JAVA从诞生开始就明智的选择了内置对多线程的支持。 在一个进程中可以创建多个线程,这些线程拥有各自的计数器、堆栈和局部变量等特性,并...
  • qq_16811963
  • qq_16811963
  • 2016年07月22日 13:59
  • 3985

[Qt学习篇]Qthread实现多线程操作

QThread类为用户管理多线程提供了一种平台无关的途径。QThread对象在程序内部进行控制线程的管理,QThread起始于run()函数额执行。默认情况下,run()通过调用exec()启动事件循...
  • u013686019
  • u013686019
  • 2014年08月26日 17:56
  • 5176

Windows线程管理和调度机制概述

1. 线程管理 线程,有时被称为轻量级进程,是程序执行流的最小单元。一个标准的线程由线程ID,当前指令指针,寄存器集合和堆栈组成。另外,线程是进程中的一个实体,是被系统独立调度和分派的基本单位,线程自...
  • m_buddy
  • m_buddy
  • 2017年06月16日 00:15
  • 1256
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:多线程学习(五)线程的调度-休眠&优先级
举报原因:
原因补充:

(最多只允许输入30个字)