线程状态图:
图来自 Java线程的6种状态及切换(透彻讲解)
初始、就绪、运行、等待、阻塞(synchronized)、终止。
Thread.sleep(millis)一定时间后自动恢复执行, 不释放对象锁 。
Object.wait()直接 释放锁 ,一直等待,知道notify()唤醒。
Thread1.join()表示运行的线程阻塞自己,等待Thread1执行完,再执行下面语句。
yield()让出cpu, 不释放对象锁 ,进入就绪态,随时可能再次运行。
只有运行态和就绪态之间涉及到CPU资源的切换。(即yield())
Thread开启的3种方式
Thread、Runnable、Callable
Runnable
Thread类也是实现了Runnable接口,实际上都是调用的Runnable接口的run()方法。
Callable
实现Callable接口,重写call()方法。创建FutureTask对象new FutureTask<>(CallableName);再new Thread(FutureTak).start();即可。FutureTask间接实现了Runnable和Future,所以实际调用的还是Thread(Runnable)构造方法。
Callable接口只有一个方法V call();
使用:
ExecutorService executor = Executors.newFixedThreadPool(3); Future<String> future = excutor.submit(Callable);//加入线程池 future.get();//获取返回值
后台线程deamon
定义:程序运行时在后台提供通用服务的线程,这种线程并不属于不可或缺的部分。后台线程运行的前提是必须有至少一个非后台线程运行。
Thread.setDeamon(ture);必须在start()前设置。
CountDownLatch
同步多个任务,可以设置一个初值,任何在这个对象上调用wait()都将被阻塞,知道值变成0,每个任务执行完调用countDown都使值减1。
初始值不能重置,只能一直减下去。CyclicBarrier可以重置。
安全失败的原理
就是CopyOnWriteArrayList方法。
java.util.concurrent包下面的所有的类都是安全失败的
快速失败的异常:ConcurrentModificationException
乐观锁:version、CAS(compareAndSwap)(Atomic包、ReentrankLock就是具体实现)
悲观锁:synchroinized
java.nio.*
基于缓冲的流。
主要组成:Channel,Buffer,Selector
clear,flip,compact区别:
ByteBuffer中有pos、lim、cap来记录缓冲使用情况。
整体流程:获取通道,分配缓冲,clear,read一次,{flip,处理读到的数据,compact,read一次}
大括号{}中表示循环执行。
void fileChannel(){ try { FileInputStream fis = new FileInputStream("content.txt"); FileChannel channel = fis.getChannel(); ByteBuffer byteBuffer = ByteBuffer.allocate(1024);//分配缓冲 //position置为0,limit置为capacity byteBuffer.clear(); int read = channel.read(byteBuffer); System.out.println(byteBuffer); while (read!=-1){ //limit置成position最后的位值,再指针position调成0 //从头读。(position、capacity、limit) byteBuffer.flip(); while(byteBuffer.hasRemaining()){ System.out.print((char)byteBuffer.get()); } //把未读完的数据压缩至0-position, //下一次从position到limit读 byteBuffer.compact(); read=channel.read(byteBuffer); } channel.close(); fis.close(); }catch (IOException e){ e.printStackTrace(); } }
fileChannel还有tryLock(),lock()和release()方法。tryLock为非阻塞式,得不到锁就立马返回
IO多路复用——selector【NIO的重点】
一个选择器管理多个Channel。
推荐优秀博客: NIO的三大组件