Java线程和线程池
Android中创建线程的方式有,new Thread,new Thread(Runnable),new Thread(Callable)的形式。
A. 直接new Thread简单方便.
B. new Thread(Runnable)这种形式相比第一种更简单明了。
C. Callable相比于Runnable,在于它有返回值。
其适用的方式如下:
package com.fxb.threadtest; import android.util.Log; import java.util.concurrent.Callable;
import java.util.concurrent.FutureTask; public class ThreadTest { public static void callableTest(){
Callable<Integer> callable = new Callable<Integer>() {
@Override
public Integer call() throws Exception {
Thread.sleep(1000);
Log.i(MainActivity.TAG, "create by callable!");
return 0;
}
};
FutureTask<Integer> task = new FutureTask<Integer>(callable);
new Thread(task, "mytask").start();
} public static void threadTest(){
new Thread(){
@Override
public void run() {
super.run();
Log.i(MainActivity.TAG, "create by thread!");
}
}.start();
} public static void runnableTest(){
new Thread(new Runnable() {
@Override
public void run() {
Log.i(MainActivity.TAG, "create by runnable!");
}
}).start();
} }
线程池能够对线程进行缓存和复用,减少频繁新建线程和销毁线程带来的性能开销和内存碎片等问题,常用于网络通信和文件读写等任务中。常见的线程池有CachedThreadPool,FixedThreadPool,ScheduledThreadPool,SingleThreadPool这几种。
CachedThreadPool,容量无限,可以缓存。
FixedThreadPool,固定容量,任务量超过最大值时等待。
ScheduledThreadPool,定时延迟执行任务。
SingleThreadPool,单个线程执行,所有任务依次执行。
使用样例如下:
package com.fxb.threadtest; import android.util.Log; import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.ScheduledExecutorService;
import java.util.concurrent.TimeUnit; public class ThreadPoolTest { public static void cachePoolTest(){
final ExecutorService cachePool = Executors.newCachedThreadPool();
for(int i=0; i<10; ++i){
final int index = i;
cachePool.execute(new Runnable() {
@Override
public void run() {
try {
Thread.sleep(1000);
Log.i(MainActivity.TAG, "index is:"+index);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
});
}
} public static void fixedPoolTest(){
final ExecutorService fixedPool = Executors.newFixedThreadPool(3);
for(int i=0; i<10; ++i){
final int index = i;
fixedPool.execute(new Runnable() {
@Override
public void run() {
try {
Thread.sleep(1000);
Log.i(MainActivity.TAG, "index is:"+index);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
});
}
} public static void scheduledPoolTest(){
final ScheduledExecutorService scheduledPool = Executors.newScheduledThreadPool(5);
scheduledPool.scheduleAtFixedRate(new Runnable() {
@Override
public void run() {
Log.i(MainActivity.TAG, "run schedule!");
}
}, 1, 3, TimeUnit.SECONDS);
} public static void singlePoolTest(){
final ExecutorService singlePool = Executors.newSingleThreadExecutor();
for(int i=0; i<10; ++i){
final int index = i;
singlePool.execute(new Runnable() {
@Override
public void run() {
try {
Thread.sleep(1000);
Log.i(MainActivity.TAG, "index is:"+index);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
});
}
} }
测试结果:
CachedPool,0-9瞬间一起打印
FixedPool,0-2,3-5,6-8,9每隔1s打印1组
ScheduledPool,延迟1s,每隔3s打印1次
SinglePool,单个线程执行,0-9每隔1s依次打印。
Java线程和线程池的更多相关文章
- java 多线程 4 线程池
系统启动一个新线程的成本是比较高的,因为它涉及到与操作系统的交互.在这种情况下,使用线程池可以很好的提供性能,尤其是当程序中需要创建大量生存期很短暂的线程时,更应该考虑使用线程池. 与数据库连接池类似 ...
- (转)java自带线程池和队列详细讲解 - CSDN过天的专栏
一简介 线程的使用在java中占有极其重要的地位,在jdk1.4极其之前的jdk版本中,关于线程池的使用是极其简陋的.在jdk1.5之后这一情况有了很大的改观.Jdk1.5之后加入了java.util ...
- 线程和线程池的理解与java简单例子
1.线程 (1)理解,线程是系统分配处理器时间资源的基本单元也是系统调用的基本单位,简单理解就是一个或多个线程组成了一个进程,进程就像爸爸,线程就像儿子,有时候爸爸一个人干不了活就生了几个儿子干活,会 ...
- Java 四种线程池newCachedThreadPool,newFixedThreadPool,newScheduledThreadPool,newSingleThreadExecutor
介绍new Thread的弊端及Java四种线程池的使用,对Android同样适用.本文是基础篇,后面会分享下线程池一些高级功能. 1.new Thread的弊端执行一个异步任务你还只是如下new T ...
- Java四种线程池
Java四种线程池newCachedThreadPool,newFixedThreadPool,newScheduledThreadPool,newSingleThreadExecutor 时间:20 ...
- java自带线程池和队列详细讲解
Java线程池使用说明 一简介 线程的使用在java中占有极其重要的地位,在jdk1.4极其之前的jdk版本中,关于线程池的使用是极其简陋的.在jdk1.5之后这一情况有了很大的改观.Jdk1.5之后 ...
- java笔记--使用线程池优化多线程编程
使用线程池优化多线程编程 认识线程池 在Java中,所有的对象都是需要通过new操作符来创建的,如果创建大量短生命周期的对象,将会使得整个程序的性能非常的低下.这种时候就需要用到了池的技术,比如数据库 ...
- Java四种线程池newCachedThreadPool,newFixedThreadPool,newScheduledThreadPool,newSingleThreadExecutor
1.new Thread的弊端 执行一个异步任务你还只是如下new Thread吗? Java new Thread(new Runnable() { @Override public void ru ...
- Java多线程之线程池
现在是多核的时代,面向多核的编程很重要,因此基于java的并发和多线程开发非常重要. 线程池是于队列密切相关的,其中队列保存了所有等待执行的任务.工作者线程的任务很简单:从队列中获取一个任务,执行任务 ...
- Java多线程和线程池
转自:http://blog.csdn.net/u013142781/article/details/51387749 1.为什么要使用线程池 在Java中,如果每个请求到达就创建一个新线程,开销是相 ...
随机推荐
- Android SharedPreferences增,删,查操作
SharedPreferences是Android平台上一个轻量级的存储类,用来保存应用的一些常用配置,比如Activity状态,Activity暂停时,将此activity的状态保存到SharedP ...
- css3 @media支持ie8用respond.js 解决IE6~8的响应式布局问题
respond.js插件实现原理 接下来,需要理解respond.js的实现思路: 第一步,将head中所有外部引入的CSS文件路径取出来存储到一个数组当中: 第二步,遍历数组,并一个个发送AJAX请 ...
- Node.js学习起步
Node.js学习: 简单的说 Node.js 就是运行在服务端的 JavaScript.Node.js 是一个基于Chrome JavaScript 运行时建立的一个平台.Node.js是一个事件驱 ...
- day10(闭包、import模块、函数命名空间)
#闭包:嵌套函数,内部函数调用外部函数的变量 # def outer(): # a = 1 # def inner(): # print(a) # inner() # outer() def oute ...
- linux tmp清理这些事
tmp目录 首先看下FHS的定义. FHS(Filessystem Hierarchy Standard) 的重点在于规范每个特定的目录下应该要放置什么样子的数据. tmp约定的存放内容 /tmp 这 ...
- 服务端如何获取客户端请求IP地址
服务端获取客户端请求IP地址,常见的包括:x-forwarded-for.client-ip等请求头,以及remote_addr参数. 一.remote_addr.x-forwarded-for.cl ...
- 在ubuntu18.04上安装EOS
在ubuntu18.04上安装EOS 在ubuntu18.04上安装EOS的目的: 把交易所的eos转到eos主网,防止交易所跑路或者交易所被黑客攻击 在不联网的安全环境下,用eos官方的命令行工具, ...
- MySQL 数据库初识
一.数据库概述 (详情参考:https://www.cnblogs.com/clschao/articles/9907529.html) 1.概念:存储数据,共享数据 数据库,简而言之可视为电子化的文 ...
- margin-left:-20px
对于负的margin值,设置其作用时要和position:absolute;一起使用
- CF 1110 D/E
CF 1110 D. Jongmah 题目大意:给你\(n\)个瓷砖,每块瓷砖上有一个数字\(a_i,(1\leq a_i\leq m)\).你可以将三个有连续数字\((比如3,4,5)\)的瓷 ...