• 学习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();
        }
    }
    
    
  • 相关阅读:
    Qt 模拟一个导航定位系统
    【编程之美】用C语言实现状态机(实用)
    代码面试之链表
    乾坤合一~Linux设备驱动之USB主机和设备驱动
    乾坤合一~Linux设备驱动之I2C核心、总线以及设备驱动
    乾坤合一~Linux设备驱动之终端设备驱动
    乾坤合一~Linux设备驱动之块设备驱动
    蜕变成蝶~Linux设备驱动之watchdog设备驱动
    蜕变成蝶~Linux设备驱动之按键设备驱动
    蜕变成蝶~Linux设备驱动之DMA
  • 原文地址:https://www.cnblogs.com/wumingzhibei/p/12572941.html
Copyright © 2020-2023  润新知