1、这两个方法来自不同的类分别是Thread和Object
2、最主要是sleep方法没有释放锁,而wait方法释放了锁,使得其他线程可以使用同步控制块或者方法。
3、wait,notify和notifyAll只能在同步控制方法或者同步控制块里面使用,而sleep可以在
任何地方使用(使用范围)
synchronized(x){
x.notify()
//或者wait()
}
4、sleep必须捕获异常,而wait,notify和notifyAll不需要捕获异常
扩充阅读:
java 线程中的sleep和wait有一个共同作用,停止当前线程任务运行,但他们存在一定的不同,首先我们先看sleep中的构造函数
sleep(long millis) Causes the currently executing thread to sleep (temporarily cease execution) for the specified number of milliseconds, subject to the precision and accuracy of system timers and schedulers.
sleep(long millis, int nanos) Causes the currently executing thread to sleep (cease execution) for the specified number of milliseconds plus the specified number of nanoseconds, subject to the precision and accuracy of system timers and schedulers.
sleep方法属于Thread类中方法,表示让一个线程进入睡眠状态,等待一定的时间之后,自动醒来进入到可运行状态,不会马上进入运行状态,因为线程调度机制恢复线程的运行也需要时间,一个线程对象调用了sleep方法之后,并不会释放他所持有的所有对象锁,所以也就不会影响其他进程对象的运行。但在sleep的过程中过程中有可能被其他对象调用它的interrupt(),产生InterruptedException异常,如果你的程序不捕获这个异常,线程就会异常终止,进入TERMINATED状态,如果你的程序捕获了这个异常,那么程序就会继续执行catch语句块(可能还有finally语句块)以及以后的代码。
注意sleep()方法是一个静态方法,也就是说他只对当前对象有效,通过t.sleep()让t对象进入sleep,这样的做法是错误的,它只会是使当前线程被sleep 而不是t线程
wait方法
void wait(long timeout)
Causes the current thread to wait until either another thread invokes the notify() method or the notifyAll() method for this object, or a specified amount of time has elapsed.
void wait(long timeout, int nanos)
Causes the current thread to wait until another thread invokes the notify() method or the notifyAll() method for this object, or some other thread interrupts the current thread, or a certain amount of real time has elapsed.
wait属于Object的成员方法,一旦一个对象调用了wait方法,必须要采用notify()和notifyAll()方法唤醒该进程;如果线程拥有某个或某些对象的同步锁,那么在调用了wait()后,这个线程就会释放它持有的所有同步资源,而不限于这个被调用了wait()方法的对象。wait()方法也同样会在wait的过程中有可能被其他对象调用interrupt()方法而产生
InterruptedException,效果以及处理方式同sleep()方法
追加内容:
Collection是个java.util下的接口,它是各种集合结构的父接口。
Collections是个java.util下的类,它包含有各种有关集合操作的静态方法。
Collection 层次结构中的根接口。Collection 表示一组对象,这些对象也称为 collection的元素。一些 collection 允许有重复的元素,而另一些则不允许。一些 collection 是有序的,而另一些则是无序的。JDK 不提供此接口的任何直接 实现:它提供更具体的子接口(如 Set 和 List)实现。此接口通常用来传递 collection,并在需要最大普遍性的地方操作这些 collection。
collections 此类完全由在 collection 上进行操作或返回 collection 的静态方法组成。它包含在 collection 上操作的多态算法,即“包装器”,包装器返回由指定 collection 支持的新 collection,以及少数其他内容。 如果为此类的方法所提供的 collection 或类对象为 null,则这些方法都会抛出 NullPointerException。
java多线程:
线程或者说多线程,是我们处理多任务的强大工具。线程和进程是不同的,每个进程都是一个独立运行的程序,拥有自己的变量,且不同进程间的变量不能共享;而线程是运行在进程内部的,每个正在运行的进程至少有一个线程,而且不同的线程之间可以在进程范围内共享数据。也就是说进程有自己独立的存储空间,而线程是和它所属的进程内的其他线程共享一个存储空间。线程的使用可以使我们能够并行地处理一些事情。线程通过并行的处理给用户带来更好的使用体验,比如你使用的邮件系统(outlook、Thunderbird、foxmail等),你当然不希望它们在收取新邮件的时候,导致你连已经收下来的邮件都无法阅读,而只能等待收取邮件操作执行完毕。这正是线程的意义所在。
实现线程的方式
实现线程的方式有两种:
public class ThreadTest extends Thread {
public void run() {
// 在这里编写线程执行的主体
// do something
}
}
public class RunnableTest implements Runnable {
public void run() {
// 在这里编写线程执行的主体
// do something
}
}
public class ThreadStartTest {
public static void main(String[] args) {
// 创建一个线程实例
ThreadTest tt = new ThreadTest();
// 启动线程
tt.start();
}
}
public class RunnableStartTest {
public static void main(String[] args) {
// 创建一个线程实例
Thread t = new Thread(new RunnableTest());
// 启动线程
t.start();
}
}
public void run() {
if (target != null) {
target.run();
}
}
public enum State {
NEW,
RUNNABLE,
BLOCKED,
WAITING,
TIMED_WAITING,
TERMINATED;
}
public static native void sleep(long millis) throws InterruptedException;
public static void sleep(long millis, int nanos) throws InterruptedException {
//other code
}
public class InterruptTest {
public static void main(String[] args) {
Thread t = new Thread() {
public void run() {
try {
System.out.println("我被执行了-在sleep()方法前");
// 停止运行10分钟
Thread.sleep(1000 * 60 * 60 * 10);
System.out.println("我被执行了-在sleep()方法后");
} catch (InterruptedException e) {
System.out.println("我被执行了-在catch语句块中");
}
System.out.println("我被执行了-在try{}语句块后");
}
};
// 启动线程
t.start();
// 在sleep()结束前中断它
t.interrupt();
}
}
public final void wait() throws InterruptedException {
//do something
}
public final native void wait(long timeout) throws InterruptedException;
public final void wait(long timeout, int nanos) throws InterruptedException {
//do something
}
public synchronized void aMethod() {
// do something
}
public static synchronized void anotherMethod() {
// do something
}
public void test() {
// 同步锁
String lock = "LOCK";
// 同步块
synchronized (lock) {
// do something
}
int i = 0;
// ...
}
private Lock lock = new ReentrantLock();
public void testLock() {
// 锁定对象
lock.lock();
try {
// do something
} finally {
// 释放对对象的锁定
lock.unlock();
}
}
public abstract class Task {
public enum State {
/* 新建 */NEW, /* 执行中 */RUNNING, /* 已完成 */FINISHED
}
// 任务状态
private State state = State.NEW;
public void setState(State state) {
this.state = state;
}
public State getState() {
return state;
}
public abstract void deal();
}
import java.util.Iterator;
import java.util.LinkedList;
import java.util.List;
public class TaskQueue {
private List queue = new LinkedList();
// 添加一项任务
public synchronized void addTask(Task task) {
if (task != null) {
queue.add(task);
}
}
// 完成任务后将它从任务队列中删除
public synchronized void finishTask(Task task) {
if (task != null) {
task.setState(Task.State.FINISHED);
queue.remove(task);
}
}
// 取得一项待执行任务
public synchronized Task getTask() {
Iterator it = queue.iterator();
Task task;
while (it.hasNext()) {
task = it.next();
// 寻找一个新建的任务
if (Task.State.NEW.equals(task.getState())) {
// 把任务状态置为运行中
task.setState(Task.State.RUNNING);
return task;
}
}
return null;
}
}
public class TaskThread extends Thread {
// 该线程所属的线程池
private ThreadPoolService service;
public TaskThread(ThreadPoolService tps) {
service = tps;
}
public void run() {
// 在线程池运行的状态下执行任务队列中的任务
while (service.isRunning()) {
TaskQueue queue = service.getTaskQueue();
Task task = queue.getTask();
if (task != null) {
task.deal();
}
queue.finishTask(task);
}
}
}
import java.util.ArrayList;
import java.util.List;
public class ThreadPoolService {
// 线程数
public static final int THREAD_COUNT = 5;
// 线程池状态
private Status status = Status.NEW;
private TaskQueue queue = new TaskQueue();
public enum Status {
/* 新建 */NEW, /* 提供服务中 */RUNNING, /* 停止服务 */TERMINATED,
}
private List threads = new ArrayList();
public ThreadPoolService() {
for (int i = 0; i < THREAD_COUNT; i++) {
Thread t = new TaskThread(this);
threads.add(t);
}
}
// 启动服务
public void start() {
this.status = Status.RUNNING;
for (int i = 0; i < THREAD_COUNT; i++) {
threads.get(i).start();
}
}
// 停止服务
public void stop() {
this.status = Status.TERMINATED;
}
// 是否正在运行
public boolean isRunning() {
return status == Status.RUNNING;
}
// 执行任务
public void runTask(Task task) {
queue.addTask(task);
}
protected TaskQueue getTaskQueue() {
return queue;
}
}
public class SimpleTaskTest extends Task {
@Override
public void deal() {
// do something
}
public static void main(String[] args) throws InterruptedException {
ThreadPoolService service = new ThreadPoolService();
service.start();
// 执行十次任务
for (int i = 0; i < 10; i++) {
service.runTask(new SimpleTaskTest());
}
// 睡眠1秒钟,等待所有任务执行完毕
Thread.sleep(1000);
service.stop();
}
}
public static ExecutorService newCachedThreadPool() {
// other code
}
public static ExecutorService newFixedThreadPool(int nThreads) {
// other code
}
public static ExecutorService newSingleThreadExecutor() {
// other code
}
import java.util.concurrent.*;
public class ExecutorTest {
public static void main(String[] args) throws InterruptedException,
ExecutionException {
ExecutorService es = Executors.newSingleThreadExecutor();
Future fr = es.submit(new RunnableTest());// 提交任务
Future fc = es.submit(new CallableTest());// 提交任务
// 取得返回值并输出
System.out.println((String) fc.get());
// 检查任务是否执行完毕
if (fr.isDone()) {
System.out.println("执行完毕-RunnableTest.run()");
} else {
System.out.println("未执行完-RunnableTest.run()");
}
// 检查任务是否执行完毕
if (fc.isDone()) {
System.out.println("执行完毕-CallableTest.run()");
} else {
System.out.println("未执行完-CallableTest.run()");
}
// 停止线程池服务
es.shutdown();
}
}
class RunnableTest implements Runnable {
public void run() {
System.out.println("已经执行-RunnableTest.run()");
}
}
class CallableTest implements Callable {
public Object call() {
System.out.println("已经执行-CallableTest.call()");
return "返回值-CallableTest.call()";
}
}