多线程 -Thread

多线程 -Thread 一.概念一个进程太“重”了创建一个进程比较重消耗的资源比较多时间也比较长销毁一个进程也很重所以线程就是为了解决这个问题线程要比进程“轻”创建线程的开销比创建进程小很多销毁线程的开销也比销毁进程小很多。同时使用多线程也能解决并发编程的问题因此使用多线程就可以代替多进程的模型二.小结1进程包含线程一个进程中可以有一个或多个线程但是不能有0个线程2进程是资源分配的基本单位线程是调度执行的基本单位3每个进程都有自己独立的资源一个进程的多个线程之间共用同一份资源进程和进程之间是“隔离”的一个进程出问题不容易影响到其他别的进程同一个进程的线程和线程之间是“共享资源”的好处让线程的创建节省资源申请的开销销毁也节省资源释放的开销坏处容易冲突一个线程出问题也容易把其他线程带走4线程也称为“轻量级进程”主要体现在资源申请和释放时开销更低三.代码1.继承Thread这个代码也有一个线程点击运行创建一个java进程java进程中就有一个线程这个线程调用main方法这个线程也叫主线程继承Thread由于Thread在Java.long包里就不需要import并重写run方法使用线程结果多个线程的代码中线程和线程之间是“并发”的关系执行逻辑的顺序谁在前谁在后都有可能操作系统调度线程的顺序是”随机“的如果将myThread.start()改成myThread.run()那么就不会并发执行2.使用Runnable3.匿名内部类此处定义的t并不是指向Thread的实例而是指向了Thread的一个子类这个子类叫啥名字不知道匿名的1.创建Thread的匿名子类2.重写run方法3.创建子类的实例赋值给t引用使用时需注意这个匿名内部类的逻辑是“一次性的”另一方面这里的逻辑最好不要太复杂4.使用匿名内部类基于Runnable用匿名内部类的实例作为参数5.基于lambda表达式第一种方法 把线程和线程要执行的任务“耦合在一起”第二种方法Runnable表示“要执行的任务”Thread表示“线程”解耦合第三种方法匿名内部类第四种方法匿名内部类基于Runnable第五种方法lambda表达式四.两种线程前台线程这个线程如果没执行完此时进程就不会结束前台线程会阻止进程结束后台线程这个线程执行完还是没执行完都不会影响进程的结束后台线程不会阻止进程结束五.Thread的几种属性1.isDaemon2.isAlive描述操作系统内核里是不是有这个线程六.Thread 类的基本用法1.创建线程2.中断线程让一个线程结束在Java中让线程结束只能通过使该线程的入口方法尽快return1.使用变量2.使用interrupt方法注while中需要用isInterrupted 方法判断当t线程处于阻塞状态包括不限于sleep外面通过Interrupt方法中止就会使t线程触发InterruptedException异常3.线程等待线程等待强调线程的结束顺序使用后结束的线程要等待先结束的线程join方法t.join()代表main等待t当调用t.join的时候要看t线程是否结束如果t线程仍然在执行join方法阻塞等待一直到t线程结束如果t线程已经结束了join方法不会阻塞直接往下执行join()中可以加入时间无时间版本就是“死等”有参数版本是有等待上限达到上限了即使对方线程还没结束也不等了4.获取线程引用Thread.currentThread()的作用是获取到当前对线程对象的引用相当于this在哪个线程中调用就能拿到哪个线程对应的对象的引用继承Thread时可以用this5.线程休眠sleep核心是让线程阻塞特殊写法sleep0 Thread.yield 虽然不休眠但是主动放弃了CPU的执行权(有些情况下需要对每个线程消耗的CPU资源做限制