学习Java的第12天
1.线程间的通信
1.三个方法
- wait():令当前线程挂起并放弃CPU、同步资源并等待。
- notify():唤醒正在排队等待同步资源的线程中优先级最高者结束等待
- notifyAll ():唤醒正在排队等待资源的所有线程结束等待.
2.三个方法使用的注意事项
-
三个方法只能在同步方法 和同步代码块之间调用 否则会报java.lang.IllegalMonitorStateException异常
-
任意对象(对象是不同类的实例化)都可以作为synchronized的同步锁,
因此这三个方法只能在Object类(Object是所有类的父类)中声明。
2.多线程的创建方式之三--实现callable接口
1.优点
- 与使用Runnable相比, Callable功能更强大些
- 相比run()方法,可以有返回值
- 方法可以抛出异常
- 支持泛型的返回值
- 需要借助FutureTask类,比如获取返回结果
2.格式
class MyThread implements Callable{
@Override
public Object call() throws Exception {
int sum = 0;
for (int i = 0; i <=100; i++) {
if (i % 2 == 0){
sum = sum + i;
}
}
return sum;
//实现callable接口 可以接受call方法的返回值
}
}
public class Call {
public static void main(String[] args) {
//1.创建callable 实现类的对象
MyThread myThread = new MyThread();
//2..创建实现了future接口runnable接口的实现类的对象 并将callable实现类的对象放入构造器参数列表
FutureTask f1 = new FutureTask(myThread);
//3.将FutureTask类的对象传入thread的参数列表中
new Thread(f1).start();
try {
//4.接收返回值
Object sum = f1.get();
System.out.println("所有偶数和为:"+sum);
} catch (InterruptedException e) {
e.printStackTrace();
} catch (ExecutionException e) {
e.printStackTrace();
}
}
}
2.多线程的创建方式之四--线程池
1.优点
- 提高响应速度(减少了创建新线程的时间)
- 降低资源消耗(重复利用线程池中线程,不需要每次都创建)
- 便于线程管理
- corePoolSize:核心池的大小
- maximumPoolSize:最大线程数( 超过则不可加入)
- keepAliveTime:线程没有任务时最多保持多长时间后会终止
2.格式
class MyThread implements Runnable {
@Override
public void run() {
for (int i = 0; i <=100; i++) {
if (i % 2 == 0){
System.out.println(i);
}
}
}
}
class MyThread1 implements Runnable {
@Override
public void run() {
for (int i = 0; i <=100; i++) {
if (i % 2 != 0){
System.out.println(i);
}
}
}
}
class MyThread2 implements Callable{
@Override
public Object call() throws Exception {
int sum = 0;
for (int i = 0; i <=100; i++) {
if (i % 2 == 0){
sum = sum + i;
}
}
return sum;
//实现callable接口 可以接受call方法的返回值
}
}
public class ThreadPool {
public static void main(String[] args) {
//1.左边是线程池接口 右边是一个线程池的工具类进行不同的操作 比如现在就是创建一个10的线程池
ExecutorService service = Executors.newFixedThreadPool(10);
//2.将实现runable 和callable 接口实现类的对象放入参数列表 该线程启动
service.execute(new MyThread());
service.execute(new MyThread1());
service.submit(new MyThread2());
//3.关闭线程池
service.shutdown();
}
}