JAVA中的多线程
JAVA中的多线程需要理解两个类
Thread
Runnable
Thread是线程类,Runnable是接口类,
Thread实现了Runnable
自定义线程继承二者的区别:
继承接口Runnable可以实现多继承,
可以用同一个对象实现变量共享
而继承Thread则只能单纯线程操作
线程方法:
1)优先级(priority)
每个类都有自己的优先级,一般property用1-10的整数表示,默认优先级是5,优先级最高是10;优先级高的线程并不一定比优先级低的线程执行的机会高,只是执行的机率高;默认一个线程的优先级和创建他的线程优先级相同;
2)Thread.sleep()/sleep(long millis)
当前线程睡眠/millis的时间(millis指定睡眠时间是其最小的不执行时间,因为sleep(millis)休眠到达后,无法保证会被JVM立即调度);sleep()是一个静态方法(static method) ,所以他不会停止其他的线程也处于休眠状态;线程sleep()时不会失去拥有的对象锁。 作用:保持对象锁,让出CPU,调用目的是不让当前线程独自霸占该进程所获取的CPU资源,以留一定的时间给其他线程执行的机会;
让出CPU的使用权,给其他线程执行机会、让同等优先权(或更高)的线程运行(但并不保证当前线程会被JVM再次调度、使该线程重新进入Running状态),如果没有同等优先权的线程,那么yield()方法将不会起作用。// by zj 自身会转为就绪态
使用该方法的线程会在此之间执行完毕后再往下继续执行。
// by zj main线程中执行了jt.join,所以会等待jt线程执行完毕,相当于变成了同步的方法
public static void main(String[] args){
Thread jt=new JoinThread();
jt.start();
jt.join();
System.out.print("main");
}
当一个线程执行到wait()方法时,他就进入到一个和该对象相关的等待池(Waiting Pool)中,同时失去了对象的机锁—暂时的,wait后还要返还对象锁。当前线程必须拥有当前对象的锁,如果当前线程不是此锁的拥有者,会抛出IllegalMonitorStateException异常,所以wait()必须在synchronized block中调用。
唤醒在当前对象等待池中等待的第一个线程/所有线程。notify()/notifyAll()也必须拥有相同对象锁,否则也会抛出IllegalMonitorStateException异常。
setDaemon()
设置守护线程,守护线程是会随父线程死亡而一同死亡的线程
currentThread()
得到当前线程的引用
isAlive()
判断线程是否存活,一旦死亡后不能再次start(),否则会引发IllegalThreadStateException异常(同一线程new之后,不能两次调用start())