1.Java中实现多线程的几种方法
-
-
实现Runnable接口
-
实现Callable接口
-
线程池方式创建
-
-
优点:直接使用this即可获取当前线程,编程简单
-
缺点:已经继承了Thread类,无法再继承其他父类了
-
-
优点:线程类只是实现了Runnable或者Callable接口,还可以继承其他类。这种方式下,多个线程可以给共享一个target对象,所以比较适合多个相同线程来处理同一份资源的情况。
-
缺点:编程较为复杂,如果需要访问当前线程,则必须使用
Thread.currentThread()方法。 -
区别:
-
Runnable通过重写run方法实现,Callable通过call方法实现
-
Runnable可以提交给Thread来包装下直接启动一个线程来执行,Callable一般都是提交给ExcuteService来执行
-
Runnable的任务无返回值,Callable的任务执行后有返回值
-
call方法可以抛出异常,run方法不可以
-
运行Callable任务可以拿到一个Future对象,表示异步计算的结果。
3.
6.为什么wait和notify方法要在同步块中调用?
-
-
如果不这么做会抛出IllegalMonitorStateException异常
-
避免wait()和notify()之间产生竞态条件 wait()方法强制当前线程释放对象锁。这意味着在调用某对象的wait()方法之前,当前线程必须已经获得该对象的锁。因此线程必须在某个对象的同步方法或同步代码块中才能够调用该对象的wait()方法。 在调用对象的notify()和notifyAll()方法之前,调用线程必须已经得到该对象的锁,因此,必须在某个对象的同步方法或同步代码块中才能够调用该对象的notify()和notifyAll()方法。 调用wait()方法的原因通常是调用线程希望某个特殊的状态或变量被设置之后再继续执行。 调用notify()和notifyAll()方法的原因通常是调用线程希望告诉其他等待线程"特殊状态已被设置"。 这个状态作为线程间通信的通道,他必须是一个可变的共享状态或变量。