原文做者:Ykamh编程
原文地址:juejin.im/post/5bd3c2…多线程
阅读时长:20分钟并发
技术预备:Java基础socket
随着开发项目中业务功能的增长,必然某些功能会涉及到线程以及并发编程的知识点。笔者就在如今的公司接触到了不少软硬件结合和socket通信的项目了,不少的功能运用到了串口通信编程,串口通信编程的安卓端就是基于线程的方式和硬件保持通信的。post
关于Java线程,先了解一下Java线程的生命周期和物种基本状态,先上一张经典的图线程
上图也比较直观的绘制了关于Java线程的生命周期同时也囊括了Java线程的重点知识点。cdn
当线程对象建立后,线程即进入新建状态,如:Thread t = new MyThread();对象
当线程对象的start()方法(t.start();)调用时,此时线程进入就绪状态。处于就绪状态的线程只能说明线程此时已经作好准备,随时等待CPU的调度并非说 t.start(): 后线程就会立马执行;blog
当CPU开始调度已经处于就绪状态的线程时,此时线程才真正的开始他的工做,即进入了运行状态。注意(敲黑板!):就绪状态是进入到运行状态的惟一入口。也就是说线程想进入运行状态,那线程就必须先处于就绪状态。继承
处于运行状态的线程处于某种缘由呢,暂时放弃了对CPU的使用权,中止了执行,此时也就进入了阻塞状态,知道线程再次进入到就绪状态,才有机会被CPU调用进入到运行状态。而根据形成阻塞的缘由不一样,分为了一下三种阻塞:
等待阻塞:运行状态的线程执行到了wate()方法,使线程进入了等待阻塞状态。
同步阻塞:线程在获取synchronized同步锁失败(由于锁被其余线程占用),他就会进入同步阻塞状态。
其余阻塞:经过线程的sleep()和join()或发出了I/O请求,线程进入到了阻塞状态。当sleep()超时、join()等待线程终止或超时、I/O处理完毕时,线程就会再次进入就绪状态。
线程执行完了或者在执行中因异常退出了run()方法,该线程就走完了他的一辈子了。
Java线程有三种常见的基本建立方式
没必要想太多,这个run()方法一样是咱们的线程执行体。重写完run方法后建立接口实例,并把该实例做为建立线程的target建立线程。没看懂不要紧,直接上代码。
具体是建立Callable接口的实现类,并实现call()方法。并使用FutureTask类来包装Callable实现类的对象,且以此FutureTask对象做为Thread对象的target来建立线程。有点绕~直接看代码吧~
这样咱们就能清楚的看得出他们之间的关系。发现FutureTask类其实是同时实现了Runnable和Future接口,使得他有了双重特性了,经过Runnable特性,能够做为Thread对象的target,而Future特性,使得其能够取得新建立线程中的call()方法的返回值。
缘由在于经过ft.get()方法获取子线程call()方法的返回值时,当子线程此方法还未执行完毕,ft.get()方法会一直阻塞,直到call()方法执行完毕才能取到返回值。
上述主要讲解了三种常见的线程建立方式,对于线程的启动而言,都是调用线程对象的start()方法,须要特别注意的是:不能对同一线程对象两次调用start()方法。
线程的开启暂时就讲这么多了,后面的文章还会继续讲述Java线程之如何优雅的关闭线程。
That's all Thank you~
----- End -----
更多好文
请扫描下面二维码
欢迎关注~