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中,如果每个请求到达就创建一个新线程,开销是相 ...
随机推荐
- (后端)Mybatis中#{}和${}传参的区别及#和$的区别小结(转)
原文地址:https://www.cnblogs.com/zqr99/p/8094234.html 最近在用mybatis,之前用过ibatis,总体来说差不多,不过还是遇到了不少问题,再次记录下, ...
- Android 如何解决dialog弹出时无法捕捉Activity的back事件
Android 如何解决dialog弹出时无法捕捉Activity的back事件 在一些情况下,我们需要捕捉back键事件,然后在捕捉到的事件里写入我们需要进行的处理,通常可以采用下面三种办法捕捉到b ...
- 《JavaScript面向对象的编程指南》--读书笔记
第一章.引言 1.5 面向对象的程序设计常用概念 对象(名词):是指"事物"在程序设计语言中的表现形式. 这里的事物可以是任何东西,我们可以看到它们具有某些明确特征,能执行某些动作 ...
- Wampserver或者帝国CMS安装后, 打开localhost显示IIS欢迎界面图片
我们在安装集成环境Wampserver或者帝国CMS之后,有时会遇到一个问题, 打开localhost显示一张IIS欢迎界面图片,这个问题该如何解决呢,我在这里简单整理了一下解决方法 电脑win10系 ...
- [翻译]LVM中逻辑卷的最大大小限制
前言: 本文是对这篇博客Maximum Size Of A Logical Volume In LVM的翻译,敬请尊重原创和翻译劳动成果,那些随意转载的大爷们,好歹也自觉注明出处.谢谢! 英文原文地址 ...
- C#面向对象 类的继承
1.类的访问权限: public:跨程序集,命名空间,必须被using引用: internal:默认当前命名空间: 2.类成员的访问权限: private:私有的,只能当前类: protecte:受保 ...
- Spring MVC 异常处理 (九)
完整的项目案例: springmvc.zip 目录 实例 除了依赖spring-webmvc还需要依赖jackson-databind(用于转换json数据格式) <dependency> ...
- Linux进程调度器的设计--Linux进程的管理与调度(十七)
1 前景回顾 1.1 进程调度 内存中保存了对每个进程的唯一描述, 并通过若干结构与其他进程连接起来. 调度器面对的情形就是这样, 其任务是在程序之间共享CPU时间, 创造并行执行的错觉, 该任务分为 ...
- 测试常用Linux命令总结
1.显示目录和文件的命令 Ls:用于查看所有文件夹的命令. Dir:用于显示指定文件夹和目录的命令 Tree: 以树状图列出目录内容 Du:显示目录或文件大小 2.修改目录,文件权限和属主及数组命 ...
- 如何使用微信web开发者工具调试企业微信
最近因工作需要围绕着企业微信来进行调试,从而掏出了我的微信web开发者工具,在进行授权的时候微信web开发者工具成功的提示了我:“您未绑定企业微信开发者权限”.那么关键来了,因为我也百度过,发现也有很 ...