java之多线程常用的几个方法汇总
sleep()
-
sleep()方法属于Thread类,主要作用是让当前线程停止执行,把cpu让给其他线程执行,如果有锁,不会释放锁,等睡眠期满之后,恢复为可运行状态,等到切换为运行状态时继续运行。
-
线程睡眠到期后自动苏醒,并返回到可运行状态,不是运行状态。sleep()中指定的时间是线程不会运行的最短时间,因此,sleep()方法不能保证该线程睡眠到期后就开始执行。
-
Thread.sleep()方法是一个静态方法。
-
java有两种sleep()方法
-
只有毫秒参数
sleep(long millis) //1s =1000ms
-
另一个只有纳秒和毫秒
sleep(long millis,int nanos)
-
-
代码示例
//令主线程暂停执行2s public class ThreadSeven { public static void main(String[] args) throws InterruptedException { long start = System.currentTimeMillis(); Thread.sleep(2000); System.out.println("时间间隔为:"+(System.currentTimeMillis()-start)); } }
-
执行结果
时间间隔为:2001
睡眠只是停止运行的最短时间,故结果会比2000稍多一点
wait(),notify(),notifyAll()
-
wait()属于object类,会释放当前线程,进入等待此对象的等待索定池。比方说,线程A调用Obj.wait(),线程A就会停止运行,而转为等待状态。至于等待多长时间,那就看其他线程是否调用Obj.notify().其优势显而易见,成为多换个线程之间进行通讯的手段。
-
wait()方法与notify()必须要与synchronized(resource)一起使用
-
调用某个对象的notify()方法能够唤醒一个正在等待这个对象的monitor(即锁,或者管程),如果有多个,只能唤醒其中的一个。
-
调用notifyAll()方法能够唤醒所有正在等待这个对象的monitor的线程;
-
示例代码
class NumberPrint implements Runnable{ private int number; public byte res[]; public static int count = 5; public NumberPrint(int number, byte a[]){ this.number = number; res = a; } public void run(){ synchronized (res){ while(count-- > 0){