学习Java的第12天

时间:2020-03-26
本文章向大家介绍学习Java的第12天,主要包括学习Java的第12天使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。

学习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();
    }
}

原文地址:https://www.cnblogs.com/wumingzhibei/p/12572941.html