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

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • 人工智能_5_决策树_随机森林

    Dean0731
  • 人工智能_2_特征处理.py

    Dean0731
  • 人工智能_4_k近邻_贝叶斯_模型评估

    Dean0731
  • SpringBoot开发案例之多任务并行+线程池处理

    前几篇文章着重介绍了后端服务数据库和多线程并行处理优化,并示例了改造前后的伪代码逻辑。当然了,优化是无止境的,前人栽树后人乘凉。作为我们开发者来说,既然站在了巨...

    小柒2012
  • iOS多线程编程之一——NSThread线程管理

    NSTread是iOS中进行多线程开发的一个类,其结构逻辑清晰,使用十分方便,但其封装度和性能不高,线程周期,加锁等需要手动处理。

    珲少
  • SpringBoot开发案例之多任务并行+线程池处理

    前几篇文章着重介绍了后端服务数据库和多线程并行处理优化,并示例了改造前后的伪代码逻辑。当然了,优化是无止境的,前人栽树后人乘凉。作为我们开发者来说,既然站在了巨...

    小柒2012
  • 死磕 java同步系列之开篇

    同步系列,这是彤哥想了好久的名字,本来是准备写锁相关的内容,但是java中的CountDownLatch、Semaphore、CyclicBarrier这些类又...

    彤哥
  • 「每天一道面试题」ReentrantLock是如何实现公平锁及可重入的?

    A、B两个线程同时执行lock()方法获取锁,假设A先执行获取到锁,此时state值加1,如果线程A在继续执行的过程中又执行了lock()方法(根据持有锁的线程...

    JavaQ
  • 实现线程方式的源码分析:Runnable,Thread,Callable,Future,FutureTask【面试+工作】

    在 Java 中,实现线程的方式主要有以下几种方式:继承 Thread, 实现 Runnable 和实现 Callable 这三种方式;采用哪种方式,主要根据实...

    奋斗蒙
  • 线程封闭和实例封闭

    SuperHeroes

扫码关注云+社区

领取腾讯云代金券