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线程和线程池的更多相关文章

  1. java 多线程 4 线程池

    系统启动一个新线程的成本是比较高的,因为它涉及到与操作系统的交互.在这种情况下,使用线程池可以很好的提供性能,尤其是当程序中需要创建大量生存期很短暂的线程时,更应该考虑使用线程池. 与数据库连接池类似 ...

  2. (转)java自带线程池和队列详细讲解 - CSDN过天的专栏

    一简介 线程的使用在java中占有极其重要的地位,在jdk1.4极其之前的jdk版本中,关于线程池的使用是极其简陋的.在jdk1.5之后这一情况有了很大的改观.Jdk1.5之后加入了java.util ...

  3. 线程和线程池的理解与java简单例子

    1.线程 (1)理解,线程是系统分配处理器时间资源的基本单元也是系统调用的基本单位,简单理解就是一个或多个线程组成了一个进程,进程就像爸爸,线程就像儿子,有时候爸爸一个人干不了活就生了几个儿子干活,会 ...

  4. Java 四种线程池newCachedThreadPool,newFixedThreadPool,newScheduledThreadPool,newSingleThreadExecutor

    介绍new Thread的弊端及Java四种线程池的使用,对Android同样适用.本文是基础篇,后面会分享下线程池一些高级功能. 1.new Thread的弊端执行一个异步任务你还只是如下new T ...

  5. Java四种线程池

    Java四种线程池newCachedThreadPool,newFixedThreadPool,newScheduledThreadPool,newSingleThreadExecutor 时间:20 ...

  6. java自带线程池和队列详细讲解

    Java线程池使用说明 一简介 线程的使用在java中占有极其重要的地位,在jdk1.4极其之前的jdk版本中,关于线程池的使用是极其简陋的.在jdk1.5之后这一情况有了很大的改观.Jdk1.5之后 ...

  7. java笔记--使用线程池优化多线程编程

    使用线程池优化多线程编程 认识线程池 在Java中,所有的对象都是需要通过new操作符来创建的,如果创建大量短生命周期的对象,将会使得整个程序的性能非常的低下.这种时候就需要用到了池的技术,比如数据库 ...

  8. Java四种线程池newCachedThreadPool,newFixedThreadPool,newScheduledThreadPool,newSingleThreadExecutor

    1.new Thread的弊端 执行一个异步任务你还只是如下new Thread吗? Java new Thread(new Runnable() { @Override public void ru ...

  9. Java多线程之线程池

    现在是多核的时代,面向多核的编程很重要,因此基于java的并发和多线程开发非常重要. 线程池是于队列密切相关的,其中队列保存了所有等待执行的任务.工作者线程的任务很简单:从队列中获取一个任务,执行任务 ...

  10. Java多线程和线程池

    转自:http://blog.csdn.net/u013142781/article/details/51387749 1.为什么要使用线程池 在Java中,如果每个请求到达就创建一个新线程,开销是相 ...

随机推荐

  1. C# Params的使用

    using System; namespace Params { class Program { static void Main(string[] args) { PrintMany("H ...

  2. [Python][小知识][NO.4] wxPython 字体选择对话框(O.O 不知道放到那里就放到这个分类的)

    1.前言 O.O 前两天回家浪了两天,断更了 哎~~~ o.o 有时候,有木有想改标签或编辑框中内容的字体呀?(o.o 反正我是没有). wxpython也可以说是所在的操作系统,有字体选择器,给我们 ...

  3. 【JS基础】类型转换——不同数据类型比较

    小试牛刀 输出下列数据比较结果 [] == 0; //==============================================================true [] == ...

  4. spring4笔记----常见的java的字符类型与xml匹配

    private List<String> schools; <property name="schools"> <list> <value ...

  5. 解决Unable to load native-hadoop library for your platform

    使用hadoop fs相应命令时候总是出现 WARN util.NativeCodeLoader: Unable to load native-hadoop library for your plat ...

  6. [20190213]学习bbed-恢复删除的数据.txt

    [20190213]学习bbed-恢复删除的数据.txt --//以前也做过类似测试,当时在用bbed做verify时错误都不处理,当时的想法就是能读出就ok了.--//而且当时也做成功,纯粹是依葫芦 ...

  7. SQL Server 2016新特性: 对JSON的支持

     SQL Server 2005开始支持XML数据类型,提供原生的XML数据类型.XML索引及各种管理或输出XML格式的函数.随着JSON的流行,SQL Server2016开始支持JSON数据类 ...

  8. EOS之记事本智能合约

    EOS记事本智能合约 本次分享的内容是一个记事本合约,调用合约中的写入动作可以将文本和作者保存到数据库中,通过记事本合约来学习EOS智能合约数据存储当中的主键自增. 合约动作 写入动作 记事本合约必须 ...

  9. Linux端口映射,80端口映射到8080端口

    iptables -t nat -A PREROUTING -i eth0 -p tcp --dport 80 -j REDIRECT --to-port 8080 其中eth0为外网网卡名称 ipt ...

  10. LeetCode算法题-Binary Watch(Java实现)

    这是悦乐书的第216次更新,第229篇原创 01 看题和准备 今天介绍的是LeetCode算法题中Easy级别的第84题(顺位题号是401).二进制手表顶部有4个LED,代表小时(0-11),底部的6 ...