多线程

2021-03-28 12:25

阅读:749

标签:出现   准备   yield   解决方法   程序   功能   map   独立   逻辑   

  • Thread类的方法
    •  join():合并线程,将其他线程合并到自己线程中来,自己的线程为阻塞状态
    •  yield():将自己的线程变到可执行状态
    •  sleep():休眠,暂停当前线程多少秒,将线程变为阻塞状态
  • Object类的方法
    •  notify():唤醒调用该方法的对象的线程
    •  wait():使调用该方法的线程等待
  • 并行和并发的区别
    •   并发:指系统有处理多个问题的能力,不一定要同时
    •   并行:指系统有同时处理过个任务的能力(多个线程是并行的)
  • 线程和进程
    •   进程:一个程序的启动就代表系统为该程序开辟了一个独立的空间为程序的运行做准备,即一个进程的发生
    •   线程:一个进程执行中,可以有一个或多个线程同时运行,这使得进程可以同时服务多个请求
  • 创建线程的3中方式
    • 1、继承Tread类,重写run()方法;
    •    缺点,由于java的单继承,继承了Tread类,就无法再继承其他类了
    • 2、实现RunAble接口,重写run()方法,并使用静态代理启动线程
    •     优点,可以实现接口的多实现
    •     缺点,没有返回值
    • 3、实现CallAble接口,重写call()方法
    •     优点,有返回值
    •     缺点,不能创建线程,只能线程池中提取已有的线程
  • 线程的状态
    • 1、新建,当写出new语句创建了一个线程时,该线程处于新建状态
    • 2、 等待,new之后,strat之前,为等待状态
    • 3、就绪,当被start方法执行后,线程进入可运行线程池,状态为就状态
    • 4、运行,得到CPU资源
    • 5、阻塞、线程莫种原因停止对CUP的使用,暂时停止运行
    • 6、死亡,线程结束
  • sleep()与wait()的区别
    •   sleep()不会释放对象的锁,wait()会释放对象的锁
  • notify()和notifyAll()的区别
    •   notify()会唤醒一个在等待池中的线程,notifyAll()会唤醒所有线程,但具体哪一个线程会获得锁,有jVM决定
  • run()和start() 的区别
    •   start()方法执行后,线程会进入就绪状态,随时等待CUP执行,CUP执行时则会实现Run()里面的线程体
  • 创建线程池有哪几种方式
方法名 功能
newFixedThreadPool(int nThreads) 创建固定大小的线程池
newSingleThreadExecutor() 创建只有一个线程的线程池
newCachedThreadPool() 创建一个不限线程数上限的线程池,任何提交的任务都将立即执行

 

  • 可以向线程池提交的任务有两种:RunnableCallable,二者的区别如下:
    • 方法签名不同,void Runnable.run(), V Callable.call() throws Exception
    • 是否允许有返回值,Callable允许有返回值
    • 是否允许抛出异常,Callable允许抛出异常
  • 线程池有哪些状态
    • 1、running:正常状态,接收新的任务
    • 2、shutdown:不接受新的任务,会继续出入队列中的任务
    • 3、stop:不接受任务,也不处理任务
    • 4、tidying:所有任务销毁,执行terminated()方法
    • 5、terminated:在tidying状态下执行了terminated()方法后进入了terminated状态
  • 什么是锁:解决资源占用的问题;保证同一时间一个对象只有一个线程在访问;保证数据的安全性。
  • 线程同步与锁定
  • 线程的并发(线程不安全):多个线程同时使用同一个资源 ,造成资源的不安全
  • 解决方法
    • 1使用关键字(同步)synchronized   exp:public synchronized void name(){} 如:hush MAP/StringBuffer()等
    • 2加入(同步块)  synchronized(引用类型变量|this|类.class){}
  • 死锁:过多的同步(synchorinzed)容易造成死锁
  • 产生死锁的条件:
    •  每个资源自能被一个线程使用,一般是指在使用了synchronized后
    • 一个线程在请求资源时,对已拥有的资源保持不放
    • 线程获得资源时,未使用完资源时,不能强行剥夺
    •  若干线程之间造成一种循环等待资源的状态
    • 所以,面对如何避免死锁这个问题,我们只需要这样回答! : 在并发程序中,避免了逻辑中出现复数个线程互相持有对方线程所需要的独占锁的的情况,就可以避免死锁。

多线程

标签:出现   准备   yield   解决方法   程序   功能   map   独立   逻辑   

原文地址:https://www.cnblogs.com/twilightDF/p/13632798.html


评论


亲,登录后才可以留言!