学习笔记;
wait()方法 就会阻塞此线程 会释放同步监视器
notify()就会唤醒wait的一个线程,如果有多个wait的线程,首先唤醒优先级较高的线程
notifyall()必须使用同步代码块和同步方法中
他们三个都调用者必须是同步代码块或同步方法中的同一个同步监视器,否则出现异常IllegalMonitorStateException
package com.truswei;
public class Conmunnication {
public static void main(String[] args) {
Number n = new Number();
Thread t1 = new Thread(n);
Thread t2 = new Thread(n);
t1.setName("线程1");
t2.setName("线程2");
t1.start();
t2.start();
}
}
//wait()方法 就会阻塞此线程 会释放同步监视器
//notify()就会唤醒wait的一个线程,如果有多个wait的线程,首先唤醒优先级较高的线程
//notifyall()必须使用同步代码块和同步方法中
//他们三个都调用者必须是同步代码块或同步方法中的同一个同步监视器,否则出现异常IllegalMonitorStateException
class Number implements Runnable{
private int number =1;
@Override
public void run() {
while(true){
synchronized(this) {
notify();
if (number <=100) {
try {
Thread.sleep(10);
} catch (InterruptedException e) {
throw new RuntimeException(e);
}
System.out.println(Thread.currentThread().getName() + ":" + number);
number++;
try {
wait();
} catch (InterruptedException e) {
throw new RuntimeException(e);
}
} else {
break;
}
}
}
}
}
面试题:sleep()和wait()方法的异同
相同点:都可以使得当前线程进入阻塞状态
不同点:1.两个方法声明的位置不同,Thread类中声明sleep() Object类调用wait()方法
2.调用的需求不同,sleep()可以在任何需要的场景下调用,wait方法必须使用同步监视器,就必须只能同步代码块和同步方法中
3.如果两个都使用在同步代码块和同步方法中,sleep不会释放同步监视器,wait会释放同步监视器
还可以实现callabel接口 ---jdk5.0新增以及线程池
call()可以有返回值的
call() 可以抛出异常 ,被外面操作捕获异常
支持泛型
还可以使用线程池
好处:提高响应速度(减少了创建新线程的时间)降低资源消耗(重复利用线程池的线程)
便于线程管理
corePoolSize 核心池的大小
maximumPoolSize 最大线程数
keepAliveTime 线程没有任务时最多保持多长时间会终止