sleep()和wait()、run()和start()、notify()和notifyAll()有什么区别?

sleep()和wait()有什么区别?

1)sleep()方法是线程类(Thread)的静态方法,wait()方法是Object类的方法;

2)sleep()方法让调用线程进入睡眠状态,让出执行机会给其他线程,但是监控状态依然保持,时间到了自动恢复运行状态,wait()会让线程放弃对象锁,进入等待此对象的等待锁定池,只有notify()、notifyAll()方法才会进入运行状态;

3)调用sleep()方法的过程中,线程不会释放对象锁,而调用wait()方法的时候,线程会放弃对象锁。

run()和start()有什么区别?

start()是线程的启动者,run()是线程任务的运行者。

每个线程都是通过Thread对应的run()方法来执行(线程体),通过调用Thread类的start()方法来启动一个线程。

1)start()方法真正实现了多线程运行,调用 start() 方法来启动线程时会自动调用 run();而直接调用 run() 方法就直接执行,达不到多线程运行的目的。

2)一个线程对线的 start() 方法只能调用一次,多次调用会抛出 java.lang.IllegalThreadStateException 异常;run() 方法没有限制。

public class TestThreadRunStart {

	private static void testRun(Thread t) {
		t.run();
		try {
			Thread.sleep(1000);// 休眠1秒
			System.out.println(">>>休眠1秒<<<");
		} catch (InterruptedException e) {
			e.printStackTrace();
		}
	}

	private static void testStart(Thread t) {
		t.start();
		try {
			Thread.sleep(1000);// 休眠1秒
			System.out.println(">>>休眠1秒<<<");
		} catch (InterruptedException e) {
			e.printStackTrace();
		}
	}

	public static void main(String[] args) {
		Thread t = new Thread() {
			@Override
			public void run() {
				// 休眠3秒
				try {
					Thread.sleep(3000);
					System.out.println("===休眠3秒===");
				} catch (InterruptedException e) {
					e.printStackTrace();
				}
				System.out.println("Thread running...");
			}
		};

		//testRun(t);
		/**
		 * ===休眠3秒=== 
		 * Thread running... 
		 * >>>休眠1秒<<<
		 */
		
		testStart(t);
		/**
		 * >>>休眠1秒<<< 
		 * ===休眠3秒=== 
		 * Thread running...
		 */
	}

}

notify()和notifyAll()有什么区别?

上文提过,如果线程调用了对象的wait()方法,那么只有调用notifyAll()或notify()方法唤醒。

所以notifyAll()方法是唤醒所有wait线程,而notify()方法只随机唤醒一个wait线程。也就是说,调用了notify只有一个线程会由等待池进入锁池,而notifyAll会将该对象等待池内的所有线程移动到锁池中,等待锁竞争。

优先级高的线程竞争到对象锁的概率大,假若某线程没有竞争到该对象锁,它还会留在锁池中,唯有线程再次调用wait()方法,它才会重新回到等待池中。而竞争到对象锁的线程则继续往下执行,直到执行完了 synchronized代码块,它会释放掉该对象锁,这时锁池中的线程会继续竞争该对象锁。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章