美文网首页程序员
Android 开发也要掌握的Java并发知识 - 多线程基础1

Android 开发也要掌握的Java并发知识 - 多线程基础1

作者: 进击的包籽 | 来源:发表于2020-08-15 15:27 被阅读0次
    1.线程创建的两种方法:
    • 继承Thread类,重写run方法
    • 实现Runnable接口,创建runnable的实体对象,传给Thread来运行
    • 详情可查看Thread源码注释
    线程创建的两种方法
    2.线程的启动运行
    • 执行thread.start()方法,线程就启动了,线程只能启动一次,否者会抛出异常:java.lang.IllegalThreadStateException
    • run()跟start()的区别是:run()方法只是线程启动后会调用的方法,start()方法才能启动线程
    3.线程的停止
    • stop()方法已过时,而且太过于暴力的中断线程,可能会引起问题,就不推荐使用了
    • 推荐使用interrupt(),告诉线程要终止了,然后在线程里自行判断,完成收尾工作,然后关闭线程,这个方法可以打断sleep、wait、join,并抛出 InterruptedException 异常,而且会清除打断标记
    • interrupted() 跟 isInterrupted() 区别,两个都是获取打断标记,但 interrupted()会清除打断标记
    4.线程休眠
    • sleep()方法是Thread的静态方法,让该线程休眠n毫秒
    • sleep()方法被interrupt()打断,抛出异常,可以自行处理打断后的工作
    • TimeUnit.SECONDS.sleep(5);这个等效Thread.sleep(5000);
    • wait()是Object的方法,而且需要synchronized代码块里才能执行,否者报异常
    • sleep()不会释放锁,wait()会释放锁,等待notify()唤醒再进入就绪状态
    TimeUnit实现
    MyThread myThread = new MyThread();
    myThread.setName("MyThread");
    myThread.start();
    //主线程休眠5秒
    try {
        TimeUnit.SECONDS.sleep(5);
        myThread.interrupt();
    } catch (InterruptedException e) {
        e.printStackTrace();
    }
    
    
    MyRunnable myRunnable = new MyRunnable();
    Thread thread = new Thread(myRunnable,"myRunnable");
    thread.start();
    //主线程休眠5秒
    try {
        Thread.sleep(5000);
        thread.interrupt();
    } catch (InterruptedException e) {
        e.printStackTrace();
    }
    
    
    /**
     * 继承Thread类
     */
    class MyThread extends Thread {
        @Override
        public void run() {
            while (true) {
                //打断线程
                if (interrupted()) {
                    //这里 Thread.currentThread().isInterrupted() 会是false -> true,但在interrupted()后,true -> false,被清除了标记
                    Log.d(TAG, Thread.currentThread().getName() + ":interrupted() : " +  Thread.currentThread().isInterrupted());
                    break;
                }
                Log.d(TAG, Thread.currentThread().getName() + ":baozi");
            }
        }
    }
    
    /**
     * 实现Runnable接口
     */
    class MyRunnable implements Runnable {
        @Override
        public void run() {
            while (true) {
                //打断线程
                if (Thread.currentThread().isInterrupted()) {
                    //这里 Thread.currentThread().isInterrupted() 会是false -> true
                    Log.d(TAG, Thread.currentThread().getName() + ":interrupted(): " + Thread.currentThread().isInterrupted());
                    break;
                }
                Log.d(TAG, Thread.currentThread().getName() + ":baozi");
            }
        }
    }
    

    相关文章

      网友评论

        本文标题:Android 开发也要掌握的Java并发知识 - 多线程基础1

        本文链接:https://www.haomeiwen.com/subject/quzgdktx.html