《Java 编程思想》在并发一章中提到了Sleep休眠、优先级、后台线程,提醒读者需要了解但又不能太依赖他们。就让我们一起看看吧。

休眠Sleep

import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.TimeUnit; public class App { public static void main(String[] args) {
ExecutorService exec=Executors.newFixedThreadPool(10);
for(int i=0;i<10;i++){
exec.execute(new Task());
}
exec.shutdown();
}
}
/**
* 定义任务
* @author Administrator
*/
class Task implements Runnable{ @Override
public void run() {
try {
TimeUnit.SECONDS.sleep(2);
System.out.println(Thread.currentThread().getId());
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}

这里需要注意:

TimeUnit.SECONDS.sleep(2);

这是Java5后的新方式,以前你可能这样用:

Thread.sleep(2*1000);

不能依赖:不能依赖Sleep来顺序执行任务,如果你需要顺序执行则使用同步机制。

优先级

import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.TimeUnit; public class App { public static void main(String[] args) {
ExecutorService exec = Executors.newCachedThreadPool(); exec.execute(new Task(Thread.MIN_PRIORITY));
exec.execute(new Task(Thread.MAX_PRIORITY));
exec.shutdown();
}
} /**
* 定义任务
*
* @author Administrator
*/
class Task implements Runnable {
private int priority; public Task(int priority) {
this.priority = priority;
} @Override
public void run() {
for (int j = 0; j < 5; j++) {
Thread.currentThread().setPriority(priority);
for (int i = 0; i < 100; i++) {
if (i % 2 == 0) {
Thread.yield();
}
}
System.out.println(Thread.currentThread());
}
}
}

线程的优先级将该线程的重要性传递给了调度器,尽管CPU处理现有线程的顺序是不确定的,但调度器倾向于让优先权高的线程先执行,而优先权低的线程执行频率较低。

不能依赖:所有的程序都应该以默认的优先级运行,试图操纵线程优先级通常是一种错误,因为没法保证。另:尽管JDK有10个优先级,但多数操作系统都不能很好的映射,比如Windows有7个优先级且不固定,映射关系也不确定,Solaris有231个优先级,所以你最好使用可移植的三个级别:MIN_PRIORITY、NORM_PRIORITY和MAX_PRIORITY。


后台线程

所谓后台(daemon)线程,是指在程序运行的时候在后台提供一种通用服务的线程,并且这种线程并不属于程序中不可或缺的部分。因此,当所有的非后台线程结束时,程序也就终止了,同时会杀死进程中的所有后台线程。而且后台线程有继承性:后台线程产生的线程都是后台线程。

import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.ThreadFactory;
import java.util.concurrent.TimeUnit; public class App { public static void main(String[] args) throws InterruptedException {
ExecutorService exec = Executors.newCachedThreadPool(new MyThreadFactory());
exec.execute(new Task());
exec.shutdown();
TimeUnit.MILLISECONDS.sleep(100);
}
} /**
* 定义任务
*
* @author Administrator
*/
class Task implements Runnable { @Override
public void run() {
for(int i=0;i<100;i++){
try {
TimeUnit.MILLISECONDS.sleep(10);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println(i);
}
}
} /**
* 线程工厂
* @author Administrator
*
*/
class MyThreadFactory implements ThreadFactory{ @Override
public Thread newThread(Runnable r) {
Thread t=new Thread(r);
t.setDaemon(true);
return t;
} }

示例中使用“ThreadFactory”来设置线程属性的,可以看到输出是打印不完100个就结束了,如果你把Deamon设置为false,就能打印全部。

不能依赖:所有非后台线程一旦结束,后台线程就会立刻终止,这不能以一种优雅的方式关闭线程,所以可能会得到意想不到的结果。

PS:以上三种不能说完全摒弃不用,既然设计了就可能有用的,只是要注意使用弊端,从而达到合理使用。

Java并发之需要了解但不能太依赖的东东的更多相关文章

  1. 深入理解Java并发之synchronized实现原理

    深入理解Java类型信息(Class对象)与反射机制 深入理解Java枚举类型(enum) 深入理解Java注解类型(@Annotation) 深入理解Java类加载器(ClassLoader) 深入 ...

  2. Java并发之synchronized

    Java多线程同步关键词是常用的多线程同步手段.它可以修饰静态类方法,实例方法,或代码块.修饰static静态方法时是对整个类加锁. 一.实现原理 在JVM中对象内存分三块区域,对象头.实例数据.对齐 ...

  3. java并发之固定对象与实例

    java并发之固定对象与实例 Immutable Objects An object is considered immutable if its state cannot change after ...

  4. Java并发之BlockingQueue的使用

    Java并发之BlockingQueue的使用 一.简介 前段时间看到有些朋友在网上发了一道面试题,题目的大意就是:有两个线程A,B,  A线程每200ms就生成一个[0,100]之间的随机数, B线 ...

  5. Java并发之Semaphore的使用

    Java并发之Semaphore的使用 一.简介 今天突然发现,看着自己喜欢的球队发挥如此的棒,然后写着博客,这种感觉很爽.现在是半场时间,就趁着这个时间的空隙,说说Java并发包中另外一个重量级的类 ...

  6. Java并发之CyclicBarria的使用(二)

    Java并发之CyclicBarria的使用(二) 一.简介 之前借助于其他大神写过一篇关于CyclicBarria用法的博文,但是内心总是感觉丝丝的愧疚,因为笔者喜欢原创,而不喜欢去转载一些其他的文 ...

  7. Java并发之CyclicBarria的使用

    Java并发之CyclicBarria的使用 一.简介 笔者在写CountDownLatch这个类的时候,看到了博客园上的<浅析Java中CountDownLatch用法>这篇博文,为博主 ...

  8. Java并发之CountDownLatch的使用

    Java并发之CountDownLatch的使用 一. 简介 Java的并发包早在JDK5这个版本中就已经推出,而且Java的并发编程是几乎每个Java程序员都无法绕开的屏障.笔者今晚在家闲来无事,翻 ...

  9. java并发之hashmap源码

    在上篇博客中分析了hashmap的用法,详情查看java并发之hashmap 本篇博客重点分析下hashmap的源码(基于JDK1.8) 一.成员变量 HashMap有以下主要的成员变量 /** * ...

随机推荐

  1. Zepto.js-Ajax 请求

    Ajax 请求 执行Ajax请求.它可以是本地资源,或者通过支持HTTP access control的浏览器 或者通过 JSONP来实现跨域. 引入Ajax模块 <script src=&qu ...

  2. Angular - - ngChange、ngChecked、ngClick、ngDblclick

    ngChange 当用户更改输入时,执行给定的表达式.表达式是立即进行执行的,这个和javascript的onChange事件的只有在触发事件的变化结束的时候执行不同. 格式:ng-change=”v ...

  3. mysql 常用技巧

    1.正则使用 比 LIKE 会牺牲很多的系统资源 尽量不要用 正则的语法和JS PHP 差不多 select * from t1 where email REGEXP "@163[,.]co ...

  4. 才一年,H5的发展就成这样了......

    关于H5的发展,分享几个最近看到的惊人数据和新闻: 1.截至2015,有80%的App将全部或部分基于HTML5.这意味着大部分App的内容都将是以网页的形式呈现,典型的例子包括微信.Facebook ...

  5. jQuery 处理TextArea

    jQuery 处理TextArea: $('#btn001').click(function(e) { console.log("btn001Click"); var cmt = ...

  6. 华为oj---合并数组

    题目标题: 将两个整型数组按照升序合并,并且过滤掉重复数组元素 详细描述: 接口说明 原型: voidCombineBySort(int* pArray1,intiArray1Num,int* pAr ...

  7. QQ18年,解密8亿月活的QQ后台服务接口隔离技术

    作者:shane,腾讯后台开发高级工程师 QQ18年 1999年2月10日,腾讯QQ横空出世.光阴荏苒,那个在你屏幕右下角频频闪动的企鹅已经度过了18个年头.随着QQ一同成长的你,还记得它最初的摸样吗 ...

  8. iOS实现白板、画板功能,有趣的涂鸦工具,已封装,简单快捷使用

    一.效果图: 二.选择颜色: 分[固定颜色模式]和[自由取模式].  三.操作栏功能: 1.撤销:撤销上一步操作,可一直往上进行,直到全部清空. 2.清空:直接清除所有绘画. 3.橡皮擦:去除不要的绘 ...

  9. RejectedExecutionException 分析

    当往一个固定队列ArrayBlockingQueue 不停的提交任务时,会发生什么? 请看如下代码 private static final int QUEUE_SIZE = 20; private ...

  10. matlab 中max函数用法

    Matlab中max函数在矩阵中求函数大小的实例如下:(1)C = max(A)返回一个数组各不同维中的最大元素.如果A是一个向量,max(A)返回A中的最大元素.如果A是一个矩阵,max(A)将A的 ...