java死锁、线程状态、线程通信、线程池

打印 上一主题 下一主题

主题 971|帖子 971|积分 2917

1. 回顾


  • java实现多线程: [1]继承Thread类并重写run方法  [2]实现Runnable接口
  • 线程Thread中常用的方法: setName():   Thread.currentThread().getName():
    ​    static void sleep();   static void yield():    join():     setDeamon()设置后台线程

    • 线程安全问题: ---当多个线程共享同一个资源时,对该资源的操作就会出现线程安全问题。
    • 手动锁 Lock它是一个接口--lock()   unlock()
    • 自动锁synchronized

2. 正文


  • 什么是死锁
  • 线程都有哪些状态?
  • 线程通信( 了解 wait 和sleep的区别)
  • 线程池。
3. 什么是死锁

  1. //死锁小案例
  2. import java.util.concurrent.locks.ReentrantLock;
  3. public class ccc {
  4.     public static Object lock = new Object();
  5.     public static Object lock2 = new Object();
  6. }
  7. public class eee extends Thread {
  8.     @Override
  9.     public void run() {
  10.         synchronized (ccc.lock){
  11.             System.out.println("aaa");
  12.             synchronized (ccc.lock2){
  13.                 System.out.println("bbb");
  14.             }
  15.     }
  16. }}
  17. public class fff extends Thread{
  18.         public void run(){
  19.         synchronized (ccc.lock2){
  20.             System.out.println("fff");
  21.             synchronized (ccc.lock){
  22.                 System.out.println("e");
  23.             }
  24.         }
  25.         }
  26. }
  27. public class ddd {
  28.     public static void main(String[] args) throws InterruptedException {
  29.         eee eee = new eee();
  30.         fff fff = new fff();
  31.         eee.start();
  32.         Thread.sleep(100);
  33.         fff.start();
  34.     }
  35. }
复制代码
如何解决死锁:  (1) 减少同步代码块的嵌套。 (2)设置锁的超时时间。(3)可以使用安全类-jdk提高的安全类。
4. 线程通信



notify():唤醒。

sleep和wait方法的区别?
(1) 来自不同的类: sleep来自于Thread, wait来自Object类。
(2) 是否释放锁资源: sleep不会释放锁资源。wait会释放锁资源。
(3) 用法: sleep时间到了自然会醒,而wait需要调用notify或notifyAll()方法唤醒。
notify和notifyAll()方法的区别?
1.notify随机唤醒等待队列中一个线程,而notifyAll会唤醒等待队列中所有的线程。
5.  线程的状态

  1. NEW:新建状态
  2. RUNNABLE: start()就绪状态-时间片-运行状态. 统称为RUNNABLE
  3. BLOCKED: 堵塞状态。加锁时就如该状态
  4. WAITING: 无期等待:  调用wait方法时会进入该状态
  5. TIMED_WAITING: 有期等待---当调用sleep方法时就会进入该状态
  6. TERMINATED: 终止状态。线程的任务代码执行完毕或出现异常。
复制代码
线程的状态之间可以通过调用相应的方法,进行转换。
6. 线程池


线程池的原理:

线程池的创建
[code]package demo08;import java.util.concurrent.*;/*     Executor: 它是线程池的根接口:         void execute(Runnable command):执行Runnable类型的任务。     ExecutorService: 它是Executor的子接口。---         void shutdown():关闭线程池。需要等任务执行完毕。         shutdownNow(); 立即关闭线程池。 不在接受新的任务。         isShutdown(): 判断是否执行了关闭。         isTerminated(): 判断线程池是否终止。表示线程池中的任务都执行完毕,并且线程池关闭了         submit(Callable task);提交任务,可以提交Callable         submit(Runnable task): 提交任务,可以提交Runnable任务     Executors: 它是线程池的工具类,该类提供了创建线程池的一些静态方法 */public class Test {    public static void main(String[] args) {           //1.创建一个固定长度的线程池。//        ExecutorService executorService = Executors.newFixedThreadPool(5);        //2. 单一线程池。//        ExecutorService executorService = Executors.newSingleThreadExecutor();        //3. 可变线程池--缓存线程池//        ExecutorService executorService = Executors.newCachedThreadPool();        //4. 延迟线程池。//        ScheduledExecutorService executorService = Executors.newScheduledThreadPool(5);//        for(int i=0;i

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x
回复

使用道具 举报

0 个回复

正序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

东湖之滨

金牌会员
这个人很懒什么都没写!

标签云

快速回复 返回顶部 返回列表