本文共 5637 字,大约阅读时间需要 18 分钟。
Thread类也是实现了Runnable接口:
public class Thread implements Runnable{}Thread类重载了很多构造器: (1)无参构造函数:如果没有显示的指定线程的名称,那么线程会以“Thread-”作为前缀与一个自增数字进行组合,自增数字在整个JVM进程中将不断自增 (2)将Runnable实现类作为参数传入
Thread中常用的方法:
sleep有两个版本:
我们先看一下join方法的源码:
在join方法中,我们发现,它调用了wait()方法public class joinTest { public static void main(String[] args) throws InterruptedException{ //创建线程一 Thread threadOne=new Thread(new Runnable() { @Override public void run() { try{ Thread.sleep(1000); }catch (InterruptedException e){ e.printStackTrace(); } System.out.println("child threadOne over!"); } }); Thread threadTwo=new Thread(new Runnable() { @Override public void run() { try{ Thread.sleep(1000); }catch (InterruptedException e){ e.printStackTrace(); } System.out.println("child threadTwo over!"); } }); //启动线程 threadOne.start(); threadTwo.start(); System.out.println("wait all child thread over!"); //等待子线程执行完毕,返回 threadOne.join(); threadTwo.join(); System.out.println("all child thread over!"); }}
执行结果:
当主线程调用ThreadOne的join()方法时,主线程被阻塞,当执行完线程一时,主线程又调用ThreadTwo的join()方法,主线程再次被阻塞,当等待完线程ThreadTwo执行完毕时,主线程才会继续开始执行wait()方法具有三个方式的重载:
1)无参wait()方法: 2)wait(long timeout)函数 该方法比无参wait()方法多了一个超时参数,它的不同之处在于:如果一个线程调用共享变量的wait()方法挂起后,没有在指定的timeout ms时间内被其他线程调用该共享变量的notify()或者notifyAll()唤醒后,那么该函数还是会因为超时而返回 3)wait(long timeout,int nanos)函数 当一个线程调用了一个共享对象的wait()方法时,该调用线程会被阻塞挂起,直到发生 下面几件事之一才会返回:那么一个线程如何才能获得一个共享变量的监视器锁呢
执行synchronied同步代码块时,使用该共享变量作为参数:synchronized(共享变量){ //dosomething}
调用该共享变量的方法,并且该方法使用了synchronized修饰
synchronized void add(int a,int b){ //dosomething}
被唤醒的线程的线程不能马上从wait()方法返回并继续执行,它必须在获取了共享对象的监视器锁后才能返回,也就是唤醒它的线程释放了共享变量上的监视器锁后,被唤醒的线程也不一定会获取到共享对象的监视器锁,这是因为该线程还需要和其他线程一起竞争该锁,只有该线程竞争到了共享变量的监视器锁后才可以继续执行
我们来看一个例子,看notify()和notifyAll()的区别
public class notifyAllTest { //创建资源 private static volatile Object resourceA=new Object(); public static void main(String[] args) throws InterruptedException { //创建线程 Thread threadA=new Thread(new Runnable(){ public void run(){ //获取resourceA共享资源的监视器锁 synchronized (resourceA){ System.out.println("threadA get resourceA lock"); try{ System.out.println("threadA begin wait"); //线程A调用了共享对象resourceA的wait()方法,被阻塞 resourceA.wait(); System.out.println("threadA end wait"); }catch (InterruptedException e){ e.printStackTrace(); } } } }); //创建线程 Thread threadB=new Thread(new Runnable() { @Override public void run() { synchronized (resourceA){ System.out.println("threadB get resourceA lock"); try{ System.out.println("threadB begin wait"); resourceA.wait(); System.out.println("threadB end wait"); }catch (InterruptedException e){ e.printStackTrace(); } } } }); //创建线程 Thread threadC=new Thread(new Runnable() { @Override public void run() { synchronized (resourceA) { System.out.println("threadC begin notify"); //线程C调用共享资源的notifyAll()方法 resourceA.notify(); } } }); //启动线程 threadA.start(); threadB.start(); Thread.sleep(1000); threadC.start(); //等待线程结束 threadA.join(); threadB.join(); threadC.join(); System.out.println("main over"); }}
当调用notify()函数时:
当调用notifyAll()时:转载地址:http://pqjmb.baihongyu.com/