创建线程的两种方式

  1. extends Thread 类
public class WelComeApp {

    public static void main(String[] args) {
WelcomeThread thread = new WelcomeThread();
thread.start();
System.out.printf("1.Welcome, I'm %s.%n", Thread.currentThread().getName());
} public static class WelcomeThread extends Thread {
@Override
public void run() {
System.out.printf("2.Welcome, I'm %s.%n", Thread.currentThread().getName());
}
}
}
  1. 实现 Runnable 接口
public class WelComeApp1 {

    public static void main(String[] args) {

        Thread thread = new Thread(() -> System.out.printf("2.Welcome, I'm %s.%n", Thread.currentThread().getName()));
thread.start();
System.out.printf("1.Welcome, I'm %s.%n", Thread.currentThread().getName());
}
}

注意事项

  • 一个Thread实例调用过start方法后,就不能再次调用,否则会出现 java.lang.IllegalThreadStateException异常信息

线程的生命周期状态

位于Thread#State枚举列表出6个状态

public enum State {
NEW,
RUNNABLE,
BLOCKED,
WAITING,
TIMED_WAITING,
TERMINATED;
}
  • NEW

    刚刚创建好的线程对象,在Start方法之前

  • RUNNABLE

    在它的内部有两个子状态、ready,running。线程一定是在被cpu调度到了,再一切准备完毕下才能开始工作。

    那么READY就是获取到CPU资源,准备就绪,可以执行。

    RUNNING表示正在程序正在执行,对应到是java代码里的run方法。

  • BLOCKED

    阻塞的, 通常我们说这个形容词都是在文件系统才用的到,这里也可以这么的认为,当前线程被一个I/O操作给阻塞住了,当前所占的cpu资源被分配去做其他事情了!等阻塞完后,再申请CPU资源回到RUNABLE状态。

  • WAITING

    产生这些状态一搬在当前线程调用了Object.wait()Thread.join()

    调用Object.notify()/Object.notifyAll()回到RUNABLE

  • TIMED_WAITING

WAINT状态是有等待某个其他线程结束,而当前状态是带有事件的概念在里面,我可以等,你有时间限制。

  • TERMINATED

    这没啥好说的,当前线程结束。

多线程编程的好处与坏处

优势

  1. 大大的提高了系统的吞吐率
  2. 能充分的利用多核处理器资源
  3. 使用多线程比使用多进程更能节省资源

风险

  1. 线程安全的问题,同一个进程内的线程是共享进程资源,没有做好安全控制可能会导致数据混乱。
  2. 提高了编程难度,比如产生死锁,导致程序奔溃
  3. 可能会加重CPU负担,多个线程工作会导致上下文的切换,这也是一笔不小的开支。

参考

  • 《Java多线程编程实战指南》第1章

最新文章

  1. Ajax调用Conrtoller返回数据
  2. Leetcode-189 Rotate Array
  3. [Cocos2d-x For WP8]EaseActions缓动动作
  4. python遍历文件夹下的文件
  5. Mono for Android (2)-- Android应用程序初认识
  6. 数字IC设计-15-DPI(延续)
  7. iOS 开发 旧版 framework
  8. ROS机器人程序设计(原书第2版)补充资料 (叁) 第三章 可视化和调试工具
  9. 工厂方法模式(Factory Method Pattern)
  10. 面向对象(__str__和__repr__方法)
  11. Webdriver获取多个元素
  12. Flask Web中文教程
  13. 解决 IIS 反向代理ARR URLREWRITE 设置后,不能跨域跳转 return Redirect 问题
  14. Dart语言快速学习上手(新手上路)
  15. Qt样式表都有哪些属性可以设置
  16. Tanks!Tutorial 学习
  17. WPF中各个Template的分析(转)
  18. UI 框架
  19. Android 常见SD卡操作
  20. Android ——VideoView禁止"无法播放该视频"弹窗

热门文章

  1. 《剑指offer》面试题48. 最长不含重复字符的子字符串
  2. 个人作业2-Java代码实现数据检索并实现可视化
  3. 搭建vps(virtual private station)之Github教育礼包之DigitalOcean
  4. 动态代理jdk的Proxy与spring的CGlib
  5. Linux深入探索01-stty与键盘信号
  6. String类-intern方法
  7. IoC容器-Bean管理XML方式(创建对象和set注入属性,有参构造注入属性)
  8. 在 Dapr 中使用 Cron 绑定的计划任务
  9. 微信小程序之多选功能
  10. PriorityQueue的用法和底层实现原理