Java 线程

线程

<code>java<code> 创建线程最简单的方式就是继承<code>Thread</code>类或者实现 <code>Runnable</code>接口实现 <code>run()</code> 方法,然后调用 <code>start()</code> 方法来让线程执行。

public static void main(String[] args) {
        new Thread(new Runnable() {
            @Override
            public void run() {
                System.out.println(Thread.currentThread());
            }
        }).start();
    }

输出:

Thread[Thread-0,5,main] 这个是输出的是线程名,线程优先级以及线程组的名字,具体可以看<code>Thread</code> 的<code>toString()</code> 方法

实际上 实现 Runnable 接口的类可以看做是一个任务(<code>task</code>)真正创建线程的是 <code>Thread</code>类

线程池

JDK 中提供了 Executor 框架来创建线程池。
其中 <code>Executors</code>作为工厂类 提供了几个创建线程的工厂方法

public class ThreadTest {

    public static void main(String[] args) {
        TestTask tt = new TestTask();
        ExecutorService executorService = Executors.newFixedThreadPool(5);
        for (int i = 0; i <10;i++){
            executorService.submit(tt);
        }
    }

}

class TestTask implements Runnable {

    @Override
    public void run() {
        System.out.println(System.currentTimeMillis() + " Thread ID:" + Thread.currentThread().getId());
        try {
            Thread.sleep(1000);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    }
}

输出:

1495507701904 Thread ID:10
1495507701905 Thread ID:11
1495507701904 Thread ID:9
1495507701905 Thread ID:12
1495507701905 Thread ID:13
1495507702909 Thread ID:9
1495507702909 Thread ID:12
1495507702909 Thread ID:11
1495507702909 Thread ID:13
1495507702909 Thread ID:10

<code>newFixedThreadPool(int nThreads)</code> 接收一个 <code>int</code> 参数,返回一个固定大小的线程池,上面代码的输出可以看出十个任务提交到线程池中,前5个和后面的5个执行相差了1秒。
如果换成<code>newCachedThreadPool()</code>来创建线程池则会得到如下输出:

1495508104585 Thread ID:9
1495508104586 Thread ID:10
1495508104586 Thread ID:11
1495508104586 Thread ID:12
1495508104586 Thread ID:13
1495508104586 Thread ID:14
1495508104587 Thread ID:15
1495508104587 Thread ID:16
1495508104587 Thread ID:17
1495508104587 Thread ID:18

线程池的核心

<code>Executors</code> 提供这些工厂方法都是通过<code>ThreadPoolExecutor</code>来实现
<code>ThreadPoolExecutor</code>中提供了四个构造方法,而其他三个都是通过下图这个构造方法来实现。


jdk 源码上提供的注释说明

/**
    * Creates a new {@code ThreadPoolExecutor} with the given initial
    * parameters.
    *
    * @param corePoolSize the number of threads to keep in the pool, even
    *        if they are idle, unless {@code allowCoreThreadTimeOut} is set
    * @param maximumPoolSize the maximum number of threads to allow in the
    *        pool
    * @param keepAliveTime when the number of threads is greater than
    *        the core, this is the maximum time that excess idle threads
    *        will wait for new tasks before terminating.
    * @param unit the time unit for the {@code keepAliveTime} argument
    * @param workQueue the queue to use for holding tasks before they are
    *        executed.  This queue will hold only the {@code Runnable}
    *        tasks submitted by the {@code execute} method.
    * @param threadFactory the factory to use when the executor
    *        creates a new thread
    * @param handler the handler to use when execution is blocked
    *        because the thread bounds and queue capacities are reached
    * @throws IllegalArgumentException if one of the following holds:<br>
    *         {@code corePoolSize < 0}<br>
    *         {@code keepAliveTime < 0}<br>
    *         {@code maximumPoolSize <= 0}<br>
    *         {@code maximumPoolSize < corePoolSize}
    * @throws NullPointerException if {@code workQueue}
    *         or {@code threadFactory} or {@code handler} is null
    */

<code> corePoolSize </code> 指定线程池中保持的线程数量,即使他们是空闲的,除非设置了<code>allowCoreThreadTimeOut</code>

<code> maximumPoolSize </code> 指定线程池允许创建的最大线程数量

<code> keepAliveTime </code> 当线程池中的线程数量大于<code> corePoolSize </code>设置的数量时,大于<code> corePoolSize </code>数量的那部分线程等待新任务的最大等待时间,当超过这个时间多出来的线程将会被销毁。

<code> unit </code> <code> keepAliveTime </code>的时间单位

<code> workQueue </code> 用于保存通过 <code>execute</code> 方法提交并且未来得及执行的任务。

<code> threadFactory </code> 用来创建线程的线程工厂
<code> handler </code> 当线程池中线程数量到达极限并且 workQueue达到最大容量时 处理任务的拒绝策略

workQueue传入的是一个 <code>BlockingQueue</code>类型的参数,用于保存 Runnable 对象

可使用的<code>BlockingQueue</code>有:
<code>SynchronousQueue</code> 直接提交的队列
<code>ArrayBlockingQueue</code> 有界队列
<code>LinkedBlockingQueue</code> 无界队列
<code>PriorityBlockingQueue</code> 优先级队列

<code>handler</code>
有四种拒绝策略
<code>AbortPolicy</code> 直接抛出异常
<code>DiscardPolicy</code> 默默抛弃
<code>DiscardOldestPolicy</code> 丢弃最老的任务,也就是即将执行的任务
<code>CallerRunsPolicy</code> 在调用线程中执行

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 211,042评论 6 490
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 89,996评论 2 384
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 156,674评论 0 345
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,340评论 1 283
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,404评论 5 384
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,749评论 1 289
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,902评论 3 405
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,662评论 0 266
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,110评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,451评论 2 325
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,577评论 1 340
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,258评论 4 328
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,848评论 3 312
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,726评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,952评论 1 264
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,271评论 2 360
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,452评论 2 348

推荐阅读更多精彩内容