美文网首页程序员
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