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中,如果每个请求到达就创建一个新线程,开销是相 ...
随机推荐
- 利用ChromeCROSS可以在chrome浏览器上调试跨域代码
利用ChromeCROSS可以在chrome浏览器上调试跨域代码 1.下载ChromeCROSS文件,可百度下载,或者在我的百度云上下载:链接: https://pan.baidu.com/s/10_ ...
- Kotlin入门(22)适配器的简单优化
列表视图 为实现各种排列组合类的视图(包括但不限于Spinner.ListView.GridView等等),Android提供了五花八门的适配器用于组装某个规格的数据,常见的适配器有:数组适配器Arr ...
- android修改getprop读取到的ro.build.fingerprint属性
在build/tools/buildinfo.sh中定义ro.build.fingerprint=$BUILD_FINGERPRINT. 然后在build/core/Makefile中给BUILD_F ...
- Android/IOS手机使用Fiddler抓包
对于Android和IOS开发及测试的同事来说抓包是一个很重要的事,有利于排查问题所在,快速定位问题.但长期以来一直没有一款可以快速抓包的工具,直到有了Fiddler2. 使用步骤: 1. Fidd ...
- STL之迭代器(iterator)
1 头文件 所有容器有含有其各自的迭代器型别(iterator types),所以当你使用一般的容器迭代器时,并不需要含入专门的头文件.不过有几种特别的迭代器,例如逆向迭代器,被定义于<iter ...
- 登录views
import osimport hashlibfrom django.shortcuts import render,render_to_response,redirect,HttpResponseR ...
- 根据flickr id 下载图片
#coding=utf-8 import flickrapi import requests import os n=1 flickr=flickrapi.FlickrAPI('*********** ...
- vmware中连接U盘
1.首先安装VMware tools. 2.然后根据这篇经验操作 https://jingyan.baidu.com/article/7c6fb42828806480652c9062.html 3. ...
- win10系统中如何解决cmd中的路径和现在电脑的用户名不一致
假设原用户名老王,已删除,但是cmd后路径还是C:\Users\老王>,这与现在用户laowng不一致了需改为C:\Users\laowang>. .先新建一个管理员账户laowang,然 ...
- AI学习---深度学习&TensorFlow安装
深度学习 深度学习学习目标: 1. TensorFlow框架的使用 2. 数据读取(解决大数据下的IO操作) + 神经网络基础 3. 卷积神经网络的学习 + 验证码识别的案例 机器学习与深度学 ...