Java多线程——<八>多线程其他概念
一、概述
到第八节,就把多线程基本的概念都说完了。把前面的所有文章加连接在此:
均是个人理解和总结,代码均来自《thinking in java》,有问题欢迎大家指正。
二、多线程的其他概念
1.休眠
休眠,其实就是让线程暂停一段时间,也就是阻塞一段时间。例如:每个打印之后,每个线程都要睡眠(即阻塞),这使得线程调度器可以切换到另一个线程,进而驱动另一个任务。这导致了线程在执行顺序上得到了保证,可以通过查看打印输出消息证实这一点。
public class TaskSleepingTask extends Task{
@Override
public void run() {
try{
while(countDown-- > 0){
System.out.println(status());
/*
* 每个打印之后,每个线程都要睡眠(即阻塞),这使得线程调度器可以切换到另一个线程,进而驱动另一个任务
*/
TimeUnit.MICROSECONDS.sleep(100000);
}
/*
* 因为异常不能跨线程传回给main,所以你必须在线程里处理该异常
*/
}catch(InterruptedException e){
System.out.println();
}
}
public static void main(String[] args){
ExecutorService exec = Executors.newCachedThreadPool();
for(int i = 0 ; i < 5 ; i++){
exec.execute(new TaskSleepingTask());
}
exec.shutdown();
}
}
但是,这不代表你就可以通过休眠的方式来保证任务的执行顺序(顺序行为依赖于底层的线程机制,这种机制在不同的操作系统之间是有差异的
要想控制顺序的解决办法:1、同步控制,2、协作线程(以后再做序数)
2.优先级
优先级代表了该线程的重要性,线程调度器将倾向于让优先级高的线程先执行(但这不意味着优先权较低的线程将得不到执行,即优先权不会导致死锁)。优先级较低的线程仅仅是执行频率较低,在绝大多数时间里,所有线程都应该以默认优先级运行,试图操纵线程优先级通常是一种错误。
通过Thread.currentThread()方法来获得对驱动该任务的Thread对象的引用,然后设置线程优先级。
public class TaskPriority implements Runnable{
private int countDown = 5;
/*
* 变量d用来确保不进行任何编译器优化
*/
@SuppressWarnings("unused")
private volatile double d;//no optimization
private int priority;
public TaskPriority(int priority){
this.priority = priority;
}
/*
* 打印线程的名称、线程的优先级以及线程所属的“线程组”
*在线程内部,通过调用Thread.currentThread()来获得对驱动该任务的Thread对象的引用
*/
public String toString(){
return Thread.currentThread()+":"+countDown;
}
@Override
public void run() {
/*
* 优先级应该在run的开头部分设定,在构造器中设置他们不会有任何好处,因为Executor在此刻还没有开始执行任务
*/
Thread.currentThread().setPriority(priority);
/*
* 执行了10000次浮点运算,数学 运算是可以中断的,这里运算时间足够长,
* 因此线程调度机制才来得及介入,交换任务并关注优先级,使得最高优先级的线程被优先选择
*/
while(true){
for(int i = 1 ;i < 10000;i++){
d+=(Math.PI + Math.E)/(double)i;
if(i%1000==0)
Thread.yield();
System.out.println(this);
if(--countDown == 0 )
return;
}
}
}
public static void main(String[] args){
ExecutorService exec = Executors.newCachedThreadPool();
for(int i = 0 ; i < 5;i++){
exec.execute(new TaskPriority(Thread.MIN_PRIORITY));//
}
exec.execute(new TaskPriority(Thread.MAX_PRIORITY));//
exec.shutdown();
}
}
尽管jdk有10个优先级,但是它与多数操作系统都不能映射得很好(windows7个,solaris2个),唯一可移植的方法是当调整优先级的时候,只试用MAX_PRIORITY/NORM_PRIORITY/MIN_PRIORITY三种声明
3.让步
在你已经确认完成了在run方法的循环的一次迭代过程中所需的工作,就可以给线程调度机制一个暗示:你的工作已经做的差不多了,可以让别的线程试用cpu了。(让相同优先级的其他线程可以运行)。
java提供了调用yield()方法来实现。过这只是暗示没有任何机制保证它会被采纳,所以不能依赖该方法。如上例。
Java多线程——<八>多线程其他概念的更多相关文章
- java 并发多线程 锁的分类概念介绍 多线程下篇(二)
接下来对锁的概念再次进行深入的介绍 之前反复的提到锁,通常的理解就是,锁---互斥---同步---阻塞 其实这是常用的独占锁(排它锁)的概念,也是一种简单粗暴的解决方案 抗战电影中,经常出现为了阻止日 ...
- java 并发多线程显式锁概念简介 什么是显式锁 多线程下篇(一)
目前对于同步,仅仅介绍了一个关键字synchronized,可以用于保证线程同步的原子性.可见性.有序性 对于synchronized关键字,对于静态方法默认是以该类的class对象作为锁,对于实例方 ...
- Java基础学习(八) - 多线程
理解线程 进程是指一个内存中运行的应用程序,系统运行一个程序即是一个进程从创建,运行,结束的过程. 线程是进程中的一个执行单元,负责当前进程中程序的执行,一个进程中至少有一个线程. 多线程的特点是并发 ...
- Java线程与多线程教程
本文由 ImportNew - liken 翻译自 Journaldev. Java线程是执行某些任务的轻量级进程.Java通过Thread类提供多线程支持,应用可以创建并发执行的多个线程. 应用 ...
- core java 10~12(多线程 & I/O & Network网络编程)
MODULE 10 Threads 多线程-------------------------------- 进程: 计算机在运行过程中的任务单元,CPU在一个时间点上只能执行一个进程,但在一个时间段上 ...
- Java中的多线程Demo
一.关于Java多线程中的一些概念 1.1 线程基本概念 从JDK1.5开始,Java提供了3中方式来创建.启动多线程: 方式一(不推荐).通过继承Thread类来创建线程类,重写run()方法作为线 ...
- Java 中传统多线程
目录 Java 中传统多线程 线程初识 线程的概念 实现线程 线程的生命周期 常用API 线程同步 多线程共享数据的问题 线程同步及实现机制 线程间通讯 线程间通讯模型 线程中通讯的实现 @(目录) ...
- Java基础之多线程框架
一.进程与线程的区别 1.定义: 进程是具有一定独立功能的程序关于某个数据集合上的一次运行活动,进程是系统进行资源分配和调度的一个独立单位. 线程是进程的一个实体,是CPU调度和分派的基本单位,它是比 ...
- Java基础之多线程没那么复杂!
多线程的引入 1.什么是多线程 线程是程序执行的一条路径,一个进程中可以包含多条线程;多线程并发执行可以提高程序的效率</br> 2.进程和线程之间的关系 操作系统可以同时执行多个任务,每 ...
随机推荐
- c#获取多个List<class>合并、并将相同条件下的值累计sum
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.T ...
- 关于overflow-y:scroll ios设备不流畅的问题
最近做双创项目的时候因为页面有很多数据显示,所以打算让它Y轴方向滚动条的形式展现,但在测试阶段发现IOS设备滑动效果非常不理想: search by google之后找到解决办法: -webkit-o ...
- CentOS下安装LNMP(LINUX+NGINX+MYSQL+PHP)环境
一.安装Nginx最新版 首先查看是否有安装源包 yum list nginx (或yum info nginx) 如果没有则 vi /etc/yum.repos.d/nginx.repo #添加如 ...
- php怎么解析utf-8带BOM编码的json数据,php解析json数据返回NULL
今天遇到一个问题,json_decode解析json数据返回null,试了各种方法都不行,最后发现,原来是json文件编码的问题. 当json_decode解析utf-8带BOM格式的json数据时, ...
- xml文件对应的DTD学习
DTD文件: 1.DTD文档主要由(元素,属性,实体,PCDATA,CDATA) 2.声明一个元素:<!ELEMENT 元素名称 (元素内容)> eg: <!ELEMENT pers ...
- Firbird 将可 null 的列更新为 not null
在GOOGLE上搜到2种方法: 第一种是新加一列 C2, 然后 update myTable set C2=原字段,再删除[原字段], 但这种方法有限制,当很多其它表引到此表时,非常麻烦. 第 ...
- xtrabackup之Innobackupex全备恢复
一.当前环境 [mysql@hadoop1 ~]$ mysql --defaults-/my.cnf -uroot -p123456 -P3306 mysql> show variables l ...
- STM32F0xx_TIM输出PWM配置详细过程
前言 前面我说过STM32的定时器功能很强大,今天就来总结一下它的另外一个“强大”功能:TIM的比较输出功能,输出可调PWM波形.直接调用函数接口“TIM2_CH1_PWM(uint32_t Freq ...
- poj 3625 Building Roads
题目连接 http://poj.org/problem?id=3625 Building Roads Description Farmer John had just acquired several ...
- Orchard工作原理
概述 本文翻译仅供学习之用,了解Orchard工作原理设计思想.技术点及关键词,如有缺漏请不吝指正.鉴于能力有限定有诸多曲解或不完整的地方,请海涵.不定时完善整理. CMS不像常规的web程序,它更像 ...