• JAVA 线程


    1,线程基础

    1,继承Thread方式的线程

    • 当需要再此启动一个线程时,需要再创建对象,不能重复使用。

    2,推荐的创建线程方式:继承Runnalbe,使用Thread类

    • 1.5之前就这两种

    • callable 第三种

      • 可以有返回值 call()

      • 可以抛出异常

      • 支持泛型返回值

      • 需要借助FutureTask, 如获取返回值的时候

      • class MyThread implements Callable{
            public Object call() throws Exception{
                ....
                return null;
            }
        }
        
        MyThread thread = new MyThread();
        FutureTask f = new FutureTask(thread);
        new Thread(f).start();
        try{
            Object ret = f.get();// get()为返回值
        }catch(InterruptedException){
            
        }catch(Execution e){
            
        }
        
    • 线程池 第四种方式

      • 提高速度,降低资源消耗
      • 便于线程管理:核心池大小,最大线程数,没任务多长时间终止
      //Executors 工具类
      //ExecutorService 接口
      ExecutorService service = Executors.newFixedThreadPool(10);
      ThreadPoolExecutor executor = (ThreadPoolExecutor)service;
      executor.setxxx() //设置参数
      service.execute(Runnable);
      service.submit(Callable);
      service.shutdown();
      

    3,Thread常用方法

    getPriority() setPrioority(1,5,10)
    currentThread() 静态方法 getName() setName()
    yield() 释放cup执行权,变为就绪状态 join():在A线程中B.join() ,A就阻塞,B执行完到A
    stop() :过时方法,强制结束线程 sleep(ms) isAlive()

    4,线程分类

    守护线程,用户线程

    守护线程服务用户线程

    thread.setDaemon(true) //设置为守护线程
    
    • 最简单程序main主线程与gc回收线程
    • 若没有用户线程jvm则结束

    5,线程生命周期

    • NEW : 创建对象
    • RUNNABLE :运行 start
    • BLOCKED:阻塞 sleep,join,等待同步锁,wait,suspend:过时方法
    • WAITING:wait()
    • TIMED-WAITING:wait(time)
    • TERMINATED:stop,exception,run结束

    阻塞---》就绪:sleep,join结束获取同步锁,notify,resume:过时方法

    6,注意

    • wait:阻塞,会释放锁,必须在synchronized内
    • sleep:阻塞,不会释放锁,任何时候可以

    wait,notify,notifyall,必须在同步方法快内,方法内,不能使用lock,他们调用时是锁对象.wait,要注意 此时syn(锁对象),两个所对象必须相同

    2,线程同步

    • 同步代码块

      • 要求所有相乘同一把锁 synchronized(obj) obj是同一个对象,或同一个类
    • 同步方法:当方法内容全部需要同步时

      • 非静态方法锁即时this 需要注意
      • 静态方法时,锁时当前类本身
    • Lock :接口 1.5之后

      • 能够手动开启同步,结束同步

      • ReentrantLock lock = new ReentrantLock();
        try{
           lock.lock();
               ...
        }finally{
            lock.unlock();
        }
        
  • 相关阅读:
    关于博客
    latex句首缩进空格
    javable 之Iterable
    javable之Comparable
    常量池与Integer和String的“==”
    静态多态与动态多态
    String和StringBuilder效率不同的原理
    equals和hashcode
    Eclipse里面使用checkstyle(Google style)
    矩阵链乘问题
  • 原文地址:https://www.cnblogs.com/Dean0731/p/12363755.html
Copyright © 2020-2023  润新知