Java多线程基础篇二------常用方法

来源:互联网 发布:linux 安装bcompare 编辑:程序博客网 时间:2024/06/06 09:57

上文Java多线程基础篇一介绍了java多线程中最常见的 run()  start()  sleep()   ,

本文在简单介绍几个:

1、stop()  中断线程

粗暴的结束线程,很可能run()方法中的代码体正在执行过程中呢就被中断了。

package chc.runnable;public class StopTest {public static void main(String[] args) {Thread7  t=new Thread7();t.start();try {Thread.sleep(10);} catch (InterruptedException e) {// TODO Auto-generated catch blocke.printStackTrace();}t.stop();}}class Thread7 extends Thread{    public void run() {        for (int i = 0; i < 100*100; i++) {            System.out.println("Thread-----:"+i);        }    }}

2、wait  notify()  notifyAll()  这三个方法都是属于Object类的方法

wait()导致当前线程等待,知道其他线程调用此对象的notify()  或者 notifyAll()方法来唤醒该线程。

wait(long timeout)  导致当前线程等待直到有其他线程调用此对象的notify()或者notifyAll()方法,或者超过指定时间(参数是毫秒)。

wait(long timeout,int nanos)  这个类似于上一种方法,其中timeout还是毫秒  nanos是毫微秒,这个也是等待notify()或者notifyAll()方法唤醒  ,或者超过指定时间(指定时间=(timeout*1000000+nanos)毫微秒),可以看出,相对于上一种只是时间控制的细致了一些,估计不常用,只是API上看到了就了解一下。

notify()  唤醒在此对象监视器上等待的单个线程,如果等待线程有多个,则会选择唤醒其中一个线程进入就绪状态,选择是任意性的。

notifyAll()   当然就是唤醒此对象上的所有等待的线程使他们进入就绪状态。


3、wait()与sleep()的区别

A、首先一个最明显的区别是  wait是Object类的方法,而sleep()是Thread类的静态方法,谁调用了该方法谁去休眠,即使在a线程里调用了b线程的sleep方法,实际上还是a线程去休眠

B、比较重要的一点是sleep没有释放出锁,而wait释放了锁,是其他线程可以使用同步块资源。

sleep不出让系统资源;wait是进入线程等待池等待,出让系统资源,其他线程可以占用CPU。一般wait不会加时间限制,因为如果wait线程的运行资源不够,再出来也没用,要等待其他线程调用notify/notifyAll唤醒等待池中的所有线程,才会进入就绪队列等待OS分配系统资源。sleep(milliseconds)可以用时间指定使它自动唤醒过来,如果时间不到只能调用interrupt()强行打断。

C、使用范围:

wait,notify和notifyAll只能在同步控制方法或者同步控制块里面使用,而sleep可以在任何地方使用 
   synchronized(x){ 
      x.notify() 
     //或者wait() 
   }

D、sleep需要捕获异常,而wait不需要。