Java并发之并行程序基础

实战Java高并发程序设计笔记


有关线程你必须知道的事

  1. 进程
    • 进程(Process)是计算机中程序关于某数据集合上的一次运行活动,事系统进行资源分配和调度的基本单位,是操作系统结构的基础。
  2. 线程的几个状态
  • 首先看Thread中的一个枚举State,线程共有六个状态,每个状态的含义注释讲的已经很清楚了
/**
     * A representation of a thread's state. A given thread may only be in one
     * state at a time.
     */
    public enum State {
        /**
         * The thread has been created, but has never been started.
         */
        NEW,
        /**
         * The thread may be run.
         */
        RUNNABLE,
        /**
         * The thread is blocked and waiting for a lock.
         */
        BLOCKED,
        /**
         * The thread is waiting.
         */
        WAITING,
        /**
         * The thread is waiting for a specified amount of time.
         */
        TIMED_WAITING,
        /**
         * The thread has been terminated.
         */
        TERMINATED
    }
  • 各状态间的关系如下图

    线程状态图
  1. Thread的start( )方法和run( )方法的区别

    • run( )方法是一个普通的方法,调用该方法会在当前线程中串行执行run( )中的代码
    • start( )是个一个线程安全的方法,该方法首先会检查当前线程是否处于New状态, 然后将其加入到ThreadGroup中,最后调用Native start0( )方法,在新的线程中串行执行run( )中的代码
  2. 终止线程

  • 调用Thread.stop( )就会立即线程终止,方法太过暴力,可以强行把执行到一半的线程终止,例如如下代码
public class ThreadStop {
    public static void main(String arg[]) throws InterruptedException {
        Thread mThread = new StopThread() ;
        mThread.start();
        Thread.sleep(100);
        mThread.stop();//调用stop终止线程可导致run( )方法中的代码仅执行一部分
    }
static class StopThread extends Thread {
        @Override
        public void run() {
            for (int i = 0; i < 100000; i++) {
                    System.out.println("i "+ i);
            }
        }
    }
}

可能得到如下结果,i的值并不等于99999
i 24956
i 24957
i 24958
i 24959
i 24960
i 24961
i 24962

  1. 线程中断
  • 线程中断时一种重要的线程协作机制。严格讲,线程中断并不会使线程立即退出,而是给线程发送一个通知,并告知目标线程,有人希望你退出!目标线接到通知后如何处理完全由目标线程自行决定。
  • 中断线程(Thread.interrupt( )),通知目标线程中断,也就是设置中断标志位
 public void interrupt() {
        if (this != Thread.currentThread())
            checkAccess();
        synchronized (blockerLock) {
            Interruptible b = blocker;
            if (b != null) {
                interrupt0();           // Just to set the interrupt flag
                b.interrupt(this);
                return;
            }
        }
        interrupt0();  
    }
  • 判断是否被中断(Thread.isInterrupted( ))
public boolean isInterrupted() {
        return isInterrupted(false);
    }

    /**
     * Tests if some Thread has been interrupted.  The interrupted state
     * is reset or not based on the value of ClearInterrupted that is
     * passed.
     */
    private native boolean isInterrupted(boolean ClearInterrupted);
  • 判断是否被中断并清除当前中断状态
/**
     * Tests whether the current thread has been interrupted.  The
     * <i>interrupted status</i> of the thread is cleared by this method.  In
     * other words, if this method were to be called twice in succession, the
     * second call would return false (unless the current thread were
     * interrupted again, after the first call had cleared its interrupted
     * status and before the second call had examined it).
     *
     * <p>A thread interruption ignored because a thread was not alive
     * at the time of the interrupt will be reflected by this method
     * returning false.
     *
     * @return  <code>true</code> if the current thread has been interrupted;
     *          <code>false</code> otherwise.
     * @see #isInterrupted()
     * @revised 6.0
     */
    public static boolean interrupted() {
        return currentThread().isInterrupted(true);
    }
  • 给出一断代码,显示线程中断,注意Thread.sleep( )方法会使当前线程休眠一段时间,若在此时线程接收到中断信号,sleep会抛出InterruptedException异常,并且会清除中断标志位。若不做处理,当前线程永远不会中断。
public class ThreadInterrupt {
    public static void main(String args[]) throws InterruptedException {
        Thread thread = new InterruptThread();
        thread.start();
        Thread.sleep(1000);
        thread.interrupt();
        Thread.sleep(4000);
    }
    static class InterruptThread extends Thread {
        @Override
        public void run() {
            while (true) {
                if (Thread.currentThread().isInterrupted()) {
                    System.out.println("Interrupted");
                    break;
                }
                try {
                    Thread.sleep(2000);
                } catch (InterruptedException e) {
                    System.out.println("Interrupted when sleep");
                    e.printStackTrace();
                    Thread.currentThread().interrupt();
                }
                Thread.yield();//让出当前CPU,然后跟其他线程竞争CPU的使用权
            }
        }
    }
}
  1. 等待( wait )和通知( notify )
public final native void wait() throws InterruptedException;
public final native void notify();
public final native void notifyAll();
  • wait 会使当前线程停止进入等待队列而转换为等待状态直到其他线程在同一个object调用notify或notifyAll
  • notify 会从等待队列中随机选择一个线程将唤醒
  • notifyAll 唤醒所有等待队列中的线程,等待线程就会去竞争资源
  • wait 和 sleep 都可以让线程等待一段时间,除了wait可以被唤醒外,wait 会释放目标对象的锁而sleep不会释放任何资源
  1. 挂起( suspend ) 和继续执行( resume )线程
  • suspend会导致线程暂停的同时并不会释放任何资源。如果其他任何线程想访问被他暂用的锁时都会那不会该所而进入等待状态。直到对应线程调用resume被挂机的线程才能继续执行,但是如果resume意外地在suspend前就调用了,那么被挂起的线程可能很难有机会继续呗执行
  1. 等待线程结束( join ) 和谦让( yield )
public final void join() throws InterruptedException
public final synchronized void join(long millis)
public static native void yield();
  • join( ) 表示无限等待,它会一直阻塞当前线程,直到目标线程执行完毕
  • oin(long millis) 参数的意思是等待目标线程的最大时间,如果超过时间目标线程还没有执行完毕那么当前线程就会继续执行下去
  • yield( )一旦调用,就会使当前线程让出CPU,然后可能会跟其他线程竞争CPU资源
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,547评论 6 477
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,399评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,428评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,599评论 1 274
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,612评论 5 365
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,577评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,941评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,603评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,852评论 1 297
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,605评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,693评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,375评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,955评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,936评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,172评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 43,970评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,414评论 2 342

推荐阅读更多精彩内容