2019独角兽企业重金招聘Python工程师标准>>>
线程中有几个方法需要我们区分
1 sleep方法是表示线程执行到这的时候只是暂时处于“睡眠”状态,在这种状态下线程是不会释放CPU资源的,当到达休眠时间后,线程继续“起来”干活。当线程处于sleep状态时别的线程不可以访问被锁定的对象。
2 yield方法指的是该线程暂时释放出CPU资源把CPU资源让给其他线程,它重回就绪状态等待CPU分配给相应的CPU时间片给它然后再执行。
3 wait方法指线程进入等待状态,此时别的线程可以访问被锁定的对象,当线程处于wait状态时,只有调用notify方法才能将线程“唤醒”让该线程重新进入就绪状态。
线程的同步一般有两种一种是同步代码块,同步代码块后面有个括号,里面可以选择是同步对象还是同步类字节码。当你同步的方法中有static修饰的时候那么锁的是字节码。同步普通方法的话是当前对象,同步静态方法的话是同步的类字节码。静态变量是这个类初始化的时候,静态变量已经帮你初始化好,并且放到静态区了,你实例化出来的对象的静态变量都指向静态区中的那个静态变量的地址值。
所以当我们使用线程同步时,要明确锁的资源,到底是锁字节码还是锁对象。如果同时锁一个资源那就是互斥了。
线程只能start一次,再次启动时会报异常 IllegalThreadStateException。
JVM就是多线程的,主方法是个线程,垃圾回收也是个线程。
启动多线程的话有有三种方法
1 设计一个Thread子类并重写其run方法,实例化这个子类,并且使用这个类的start方法。
2 设计一个测试类实现runable接口,并在这个类中重写run方法,实例化一个线程把测试类当作构造参数,来构造一个新的Thread类。
3 使用匿名类,继承Thread,重写run方法,直接在run方法中写业务代码。匿名类的一个好处是可以很方便的访问外部的局部变量。前提是外部的局部变量需要被声明为final。(JDK7以后就不需要了)