美文网首页
线程学习

线程学习

作者: junwu_123 | 来源:发表于2017-08-10 14:16 被阅读0次

    纯粹是个人学习总结,如有不对的地方请吐槽。

    创建线程的三种方式:

    继承Thread类

    public class MyThread extends Thread {
        @Override
        public void run() {
            //需要在线程中运行的代码
        }
    }
    

    实现Runnable接口

    public class MyThread implements Runnable {
        @Override
        public void run() {
            //需要在线程中运行的代码
        }
    }
    

    匿名类部类

    new Thread(new Runnable() {
        @Override
        public void run() {
    
        }
    });
    new Thread(){
        @Override
        public void run() {
    
        }
    };
    

    总结

    采用实现Runnable、Callable接口的方式创见多线程时,优势是:

    线程类只是实现了Runnable接口或Callable接口,还可以继承其他类。

    在这种方式下,多个线程可以共享同一个target对象,所以非常适合多个相同线程来处理同一份资源的情况,从而可以将CPU、代码和数据分开,形成清晰的模型,较好地体现了面向对象的思想。

    劣势是:

    编程稍微复杂,如果要访问当前线程,则必须使用Thread.currentThread()方法。

    使用继承Thread类的方式创建多线程时优势是:

    编写简单,如果需要访问当前线程,则无需使用Thread.currentThread()方法,直接使用this即可获得当前线程。

    劣势是:

    线程类已经继承了Thread类,所以不能再继承其他父类。

    线程的几种状态

    ●就绪(Runnable):线程准备运行,不一定立马就能开始执行。

    ●运行中(Running):进程正在执行线程的代码。

    ●等待中(Waiting):线程处于阻塞的状态,等待外部的处理结束。

    ●睡眠中(Sleeping):线程被强制睡眠。

    ●I/O阻塞(Blocked on I/O):等待I/O操作完成。

    ●同步阻塞(Blocked on Synchronization):等待获取锁。

    ●死亡(Dead):线程完成了执行。

    线程的方法、属性

    1)优先级(priority)

    每个类都有自己的优先级,一般property用1-10的整数表示,默认优先级是5,优先级最高是10;优先级高的线程并不一定比优先级低的线程执行的机会高,只是执行的机率高;默认一个线程的优先级和创建他的线程优先级相同;

    2)Thread.sleep()/sleep(long millis)

    当前线程睡眠/millis的时间(millis指定睡眠时间是其最小的不执行时间,因为sleep(millis)休眠到达后,无法保证会被JVM立即调度);sleep()是一个静态方法(static method) ,所以他不会停止其他的线程也处于休眠状态;线程sleep()时不会失去拥有的对象锁。 作用:保持对象锁,让出CPU,调用目的是不让当前线程独自霸占该进程所获取的CPU资源,以留一定的时间给其他线程执行的机会;

    3)Thread.yield()

    让出CPU的使用权,给其他线程执行机会、让同等优先权的线程运行(但并不保证当前线程会被JVM再次调度、使该线程重新进入Running状态),如果没有同等优先权的线程,那么yield()方法将不会起作用。

    4)thread.join()

    使用该方法的线程会在此之间执行完毕后再往下继续执行。

    5)object.wait()

    当一个线程执行到wait()方法时,他就进入到一个和该对象相关的等待池(Waiting Pool)中,同时失去了对象的机锁—暂时的,wait后还要返还对象锁。当前线程必须拥有当前对象的锁,如果当前线程不是此锁的拥有者,会抛出IllegalMonitorStateException异常,所以wait()必须在synchronized block中调用。

    6)object.notify()/notifyAll()

    唤醒在当前对象等待池中等待的第一个线程/所有线程。notify()/notifyAll()也必须拥有相同对象锁,否则也会抛出IllegalMonitorStateException异常。

    7)Synchronizing Block

    Synchronized Block/方法控制对类成员变量的访问;Java中的每一个对象都有唯一的一个内置的锁,每个Synchronized Block/方法只有持有调用该方法被锁定对象的锁才可以访问,否则所属线程阻塞;机锁具有独占性、一旦被一个Thread持有,其他的Thread就不能再拥有(不能访问其他同步方法),方法一旦执行,就独占该锁,直到从该方法返回时才将锁释放,此后被阻塞的线程方能获得该锁,重新进入可执行状态。

    原文地址丢失

    相关文章

      网友评论

          本文标题:线程学习

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