创建线程的两种方式

  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章

Java多线程Thread类了解和使用的更多相关文章

  1. 探Java多线程Thread类和Runnable接口之间的联系

    首先复习一下Java多线程实现机制,Java实现多线程方法有如下这么几种: 1.继承了(extends)Thread类 2.实现了(implements)Runnable接口 也就是说  有如下两种情 ...

  2. Java并发--Thread类详情

    以下是本文的目录大纲: 一.线程的状态 二.上下文切换 三.Thread类中的方法 转载原文链接:http://www.cnblogs.com/dolphin0520/p/3920357.html 一 ...

  3. Java 线程--继承java.lang.Thread类实现线程

    现实生活中的很多事情是同时进行的,Java中为了模拟这种状态,引入了线程机制.先来看线程的基本概念. 线程是指进程中的一个执行场景,也就是执行流程,进程和线程的区别: 1.每个进程是一个应用程序,都有 ...

  4. java.lang.Thread类详解

    java.lang.Thread类详解 一.前言 位于java.lang包下的Thread类是非常重要的线程类,它实现了Runnable接口,今天我们来学习一下Thread类,在学习Thread类之前 ...

  5. Java多线程——ThreadLocal类的原理和使用

    Java多线程——ThreadLocal类的原理和使用 摘要:本文主要学习了ThreadLocal类的原理和使用. 概述 是什么 ThreadLocal可以用来维护一个变量,提供了一个ThreadLo ...

  6. 2.匿名类,匿名类对象,private/protected/public关键字、abstract抽象类,抽象方法、final关键字的使用,多线程Thread类start方法原理

    package com.bawei.multithread; //注意:模板方法我们通常使用抽象类或者抽象方法!这里我们为了方便在本类中使用就没有使用抽象类/抽象方法 public class Tem ...

  7. java多线程系类:JUC线程池:02之线程池原理(一)

    在上一章"Java多线程系列--"JUC线程池"01之 线程池架构"中,我们了解了线程池的架构.线程池的实现类是ThreadPoolExecutor类.本章,我 ...

  8. java多线程系类:JUC线程池:01之线程池架构

    概要 前面分别介绍了"Java多线程基础"."JUC原子类"和"JUC锁".本章介绍JUC的最后一部分的内容--线程池.内容包括:线程池架构 ...

  9. java多线程系类:JUC锁:01之框架

    本章,我们介绍锁的架构:后面的章节将会对它们逐个进行分析介绍.目录如下:01. Java多线程系列--"JUC锁"01之 框架02. Java多线程系列--"JUC锁&q ...

随机推荐

  1. 《剑指offer》面试题41. 数据流中的中位数

    问题描述 如何得到一个数据流中的中位数?如果从数据流中读出奇数个数值,那么中位数就是所有数值排序之后位于中间的数值.如果从数据流中读出偶数个数值,那么中位数就是所有数值排序之后中间两个数的平均值. 例 ...

  2. actf2020 exec

    actf2020 exec 1.根据提示,ping一个127.0.0.1,有回显,ls一下发现index.php 3.方向找错了,绕了一大圈,还cat了index.php也没发现什么 最后没招了,回原 ...

  3. 程序员必备的编程助手!SmartCoder助你轻松集成HMS Core

    当开发者在集成HMS Core遇到一些疑问时,需要翻阅官网文档,反复查看集成说明或者API调用说明,或者研究GitHub上的开源示例代码,花费较多的时间,在IDE环境和网页浏览器之间反复切换也会耗费很 ...

  4. ddos攻击是什么,如何防御

    DDoS(Distributed Denial of Service,分布式拒绝服务) 定义: 主要通过大量合法的请求占用大量网络资源,从而使合法用户无法得到服务的响应,是目前最强大.最难防御的攻击之 ...

  5. proxy_buffer代理缓冲区

    目录 一:代理缓冲区 1.代理缓存区模块介绍 二:案例 1.配置文件 2.测试 3.重启 4.lb01服务器(负载均衡) 5.网址配置文件 6.测试 7.重启 8.DNS解析 9.网址测试 10.日志 ...

  6. IDEA出现Cannot resolve symbol “xxx“(无法解析符号)的解决办法

    1,File->Invalidate Caches/Restart 清除缓存并重启 idea 2,检查pom文件中的依赖关系是否正确 3,maven -> Reimport 4,打开pro ...

  7. 学习JAVAWEB第五天

    # 今日内容 1. JavaScript基础 ## JavaScript: * 概念: 一门客户端脚本语言 * 运行在客户端浏览器中的.每一个浏览器都有JavaScript的解析引擎 * 脚本语言:不 ...

  8. 「YNOI2016」自己的发明

    「YNOI2016」自己的发明 不换根 基本的莫队吧... 子树直接转到dfs序上. 其余部分可以见 「SNOI2017」一个简单的询问. 换根 根root,查询x,分3种: root不在x子树内,按 ...

  9. JAVA多线程学习七-线程池

    为什么用线程池 1.创建/销毁线程伴随着系统开销,过于频繁的创建/销毁线程,会很大程度上影响处理效率 例如: 记创建线程消耗时间T1,执行任务消耗时间T2,销毁线程消耗时间T3 如果T1+T3> ...

  10. Yarn命令列表

    常用命令: 创建项目:yarn init 安装依赖包:yarn == yarn install 添加依赖包:yarn add Yarn命令列表 命令 操作 参数 标签 yarn add 添加依赖包 包 ...