从这一篇开始我们将看看Java 5之后给我们添加的新的对线程操作的API,首先看看api文档:

java.util.concurrent包含许多线程安全、测试良好、高性能的并发构建块,我们先看看atomic包下的AtomicInteger.

import java.util.concurrent.atomic.AtomicInteger;

public class AtomicIntegerTest {
private static AtomicInteger data = new AtomicInteger(0);
public static void main(String[] args) {
new Thread(new Runnable() { @Override
public void run() {
data.incrementAndGet(); //加
}
}).start(); new Thread(new Runnable() { @Override
public void run() {
data.decrementAndGet(); //减
}
}).start();
}
}

使用AtomicInteger可以很方便的实现线程之间的数据共享,如果某个成员变量要被多个线程操作则可以使用AtomicInteger来处理,其他数据类型也有对应的Atomic.

下面我们再来看一下线程并发池的使用,在java.util.concurrent包下有关于线程并发池的相关工具类。

import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.TimeUnit; public class ThreadPoolTest {
public static void main(String[] args) {
//创建3个线程执行任务
ExecutorService threadPool = Executors.newFixedThreadPool(3);
//ExecutorService threadPool = Executors.newCachedThreadPool(); //动态添加线程
//创建单个线程(线程死后会重新启动)
//ExecutorService threadPool = Executors.newSingleThreadExecutor();
//池子中添加10个任务
for(int i=1; i<=10; i++){
final int task = i;
threadPool.execute(new Runnable() { @Override
public void run() {
//每个任务是输出1到10
for(int j=1; j<=10; j++){
try {
Thread.sleep(20);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println(Thread.currentThread().getName() +
" loop of " + j + " for task " + task);
}
}
});
}
System.out.println("10 task has commited");
threadPool.shutdown(); //线程池执行完后结束线程
//threadPool.shutdownNow(); 立即结束线程 //线程池启动定时器
Executors.newScheduledThreadPool(3).schedule(new Runnable() { @Override
public void run() {
System.out.println("bombing!");
}
}, 10, TimeUnit.SECONDS); /*Executors.newScheduledThreadPool(3).scheduleAtFixedRate(new Runnable() { @Override
public void run() {
System.out.println("bombing!");
}
}, 10, 3, TimeUnit.SECONDS);*/
}
}

创建线程池的方式有三种:

1、newFixedThreadPool(n) :创建n个线程

2、newCachedThreadPool()  :动态添加线程(依据任务池中的任务数量动态创建线程)

3、newSingleThreadPool() :创建单一线程(线程死后会重新创建)

上面代码中创建了3个线程并分配了10个任务,3个线程会先执行任务池中的3个任务,当某个线程任务执行完后会从任务池中取没有被执行的任务继续执行,直到任务池中的所有任务执行完成后,线程会处于等待状态,最后使用shutdown()方法结束线程。

Android多线程研究(7)——Java5中的线程并发库的更多相关文章

  1. Java中的线程--并发库中的集合

    线程中的知识点基本都已经学完了,看看Java5并发库中提供的集合... 一.可堵塞队列 队列包含固定长度的队列和不固定长度的队列 ArrayBlockQueue中只有put()方法和take()方法才 ...

  2. Java多线程与并发库高级应用-java5线程并发库

    java5 中的线程并发库 主要在java.util.concurrent包中 还有 java.util.concurrent.atomic子包和java.util.concurrent.lock子包 ...

  3. java--加强之 Java5的线程并发库

    转载请申明出处:http://blog.csdn.net/xmxkf/article/details/9945499 01. 传统线程技术回顾 创建线程的两种传统方式: 1.在Thread子类覆盖的r ...

  4. 线程高级应用-心得5-java5线程并发库中Lock和Condition实现线程同步通讯

    1.Lock相关知识介绍 好比我同时种了几块地的麦子,然后就等待收割.收割时,则是哪块先熟了,先收割哪块. 下面举一个面试题的例子来引出Lock缓存读写锁的案例,一个load()和get()方法返回值 ...

  5. Android多线程研究(6)——多线程之间数据隔离

    在上一篇<Android多线程研究(5)--线程之间共享数据>中对线程之间的数据共享进行了学习和研究,这一篇我们来看看怎样解决多个线程之间的数据隔离问题,什么是数据隔离呢?比方说我们如今开 ...

  6. Java5中的线程池实例讲解

    Java5增加了新的类库并发集java.util.concurrent,该类库为并发程序提供了丰富的API多线程编程在Java 5中更加容易,灵活.本文通过一个网络服务器模型,来实践Java5的多线程 ...

  7. 线程高级应用-心得8-java5线程并发库中同步集合Collections工具类的应用及案例分析

    1.  HashSet与HashMap的联系与区别? 区别:前者是单列后者是双列,就是hashmap有键有值,hashset只有键: 联系:HashSet的底层就是HashMap,可以参考HashSe ...

  8. 线程高级应用-心得4-java5线程并发库介绍,及新技术案例分析

    1.  java5线程并发库新知识介绍 2.线程并发库案例分析 package com.itcast.family; import java.util.concurrent.ExecutorServi ...

  9. 使用Java线程并发库实现两个线程交替打印的线程题

    背景:是这样的今天在地铁上浏览了以下网页,看到网上一朋友问了一个多线程的问题.晚上闲着没事就决定把它实现出来. 题目: 1.开启两个线程,一个线程打印A-Z,两一个线程打印1-52的数据. 2.实现交 ...

随机推荐

  1. virmon防火墙64位正式版(暂定)公布

    ChangeLog: 2015-06-2564位版本号签名问题临时得到解决.还要致谢一下某位黑客. 支持版本号x64 Windows Vista.7.8.8.1以上等.个人仅仅在Windows7上做了 ...

  2. php中this,self,parent三个关键字的区别辨析

    php中this,self,parent三个关键字的区别辨析 一.总结 一句话总结:this是指向对象实例的一个指针,self是对类本身的一个引用,parent是对父类的引用. 1.self关键字使用 ...

  3. 68.qq号索引结构体写入内存,并实现快速排序

    //两个步骤,第一步读取文件,并且初始化索引结构体,把初始化的索引结构体写入到文件,第二步,读取这个文件到索引结构体 //并对这个结构体进行快速排序,得到顺序的索引,再写入文件 #define _CR ...

  4. 随时查看源码的网站---http://www.sooset.com/

    由于工作需要经常要在Windows平台下参阅linux源码,以前都用http://lxr.linux.no/来浏览源码(如下图所示),最近发现sooset来浏览更方便,所以介绍给大家分享. 650) ...

  5. 根据ID和parentID利用Java递归获取全路径名称

    如下图所示,本文参考资源:https://jie-bosshr.iteye.com/blog/1996607  感谢大佬的无私奉献. 思路: 定义一个方法getParentName参数为int类型的c ...

  6. 洛谷 P1194 买礼物

    洛谷 P1194 买礼物 题目描述 又到了一年一度的明明生日了,明明想要买B样东西,巧的是,这B样东西价格都是A元. 但是,商店老板说最近有促销活动,也就是: 如果你买了第II样东西,再买第J样,那么 ...

  7. 洛谷 P1755 斐波那契的拆分

    P1755 斐波那契的拆分 题目背景 无 题目描述 已知任意一个正整数都可以拆分为若干个斐波纳契数,现在,让你求出n的拆分方法 输入输出格式 输入格式: 一个数t,表示有t组数据 接下来t行,每行一个 ...

  8. 学习笔记:Vue——处理边界情况

    访问元素&组件 01.访问根实例 $root // Vue 根实例 new Vue({ data: { foo: 1 }, computed: { bar: function () { /* ...

  9. 图像处理 Mine

    1)中值滤波:排序取中间值.作用:去噪点 1.1)均值滤波; 1.2)高斯模糊:执行高斯模糊,然后改混合模式,改成叠加.柔光或者深色.就能得到平滑而不模糊的效果. 2)腐蚀.膨胀:开运算(腐蚀后膨胀) ...

  10. sampleviewer add menu item error 'assert'

    可以跟踪到 mfc提供的源代码内部,(注:如果打开了mfc源代码,设置了断点,但是跟不进去,那就需要更新PDB文件,具体网上搜)打开 wincore.cpp文件(D:\Program Files\Mi ...