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. (后端)根据查询语句修改的update语句

    UPDATE A SET a.name = m.name FROM item A INNER JOIN table M ON A.id=M.id WHERE a.xx <> M.xx

  2. PyCharm 在PyCharm中使用GitHub

    PyCharm是当前进行Python开发,尤其是Django开发最好的IDE,GitHub是程序员的圣地,几乎人人都在用,就不详细介绍两者了. 本文假设你对PyCharm和Github都有一定的了解, ...

  3. SSL里的certificate格式资料小结

    在查看相关报文的时候,发现RFC5246本身并没有对certificate的格式AlgorithmIdentifier作深入的介绍,只说其格式必须是X509v3 DER表示,思虑良久才找到方向:后者的 ...

  4. [20190101]块内重整.txt

    [20190101]块内重整.txt --//我不知道用什么术语表达这样的情况,我仅仅一次开会对方这么讲,我现在也照用这个术语.--//当dml插入数据到数据块时,预留一定的空间(pctfree的百分 ...

  5. [20181225]12CR2 SQL Plan Directives.txt

    [20181225]12CR2 SQL Plan Directives.txt --//12C引入SQL PLAN Directives.12cR1版本会造成大量的动态取样,影响性能.许多人把OPTI ...

  6. eclipse maven web

    在eclipse中用maven创建web项目. 环境配置 C:\Users\xxx>java -versionjava version "1.8.0_121"Java(TM) ...

  7. Python描述符的使用

    Python描述符的使用 前言 作为一位python的使用者,你可能使用python有一段时间了,但是对于python中的描述符却未必使用过,接下来是对描述符使用的介绍 场景介绍 为了引入描述符的使用 ...

  8. Nginx使用教程(六):使用Nginx缓存之FastCGI缓存

    启用FastCGI缓存 <br\>编辑必须启用缓存的虚拟主机配置文件. nano /etc/nginx/sites-enabled/vhost 将以下行添加到server{}指令之外的文件 ...

  9. 如何学习sss和前端数据处理

    1.学习scss,就看这篇:http://www.ruanyifeng.com/blog/2012/06/sass.html 就够了,因为sass的出现本来就是为了简化工作提高效率,也不算什么深奥精妙 ...

  10. .Net下的全局异常捕获问题

    全局异常捕获主要目标并不是为了将异常处理掉防止程序崩溃.因为当错误被你的全局异常捕获器抓到的时候,已经证实了你程序中存在BUG. 一般而言,我们的全局异常捕获主要作用就是接收到异常之后进行异常的反馈. ...