创建线程的两种方式

  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. 使用.NET 6开发TodoList应用(28)——实现应用程序健康检查

    系列导航及源代码 使用.NET 6开发TodoList应用文章索引 需求 应用健康检查在容器部署的微服务场景下非常常见,相比而言单体非容器部署的应用就不太关心这个特性,为了后续的内容我们在本文中简单介 ...

  2. 【Java常用类】Instant:瞬时

    Instant:瞬时 时间线上的一个瞬时点. 这可能被用来记录应用程序中的事件时间戳,该类型是面向机器的. now():获取本初子午线对应的标准时间 Instant instant = Instant ...

  3. Python函数与lambda 表达式(匿名函数)

    Python函数 一.函数的作用 函数是组织好的,可重复使用的,用来实现单一或相关联功能的代码段 函数能提高应用的模块性和代码的重复利用率 python 内置函数:https://docs.pytho ...

  4. ASCII、Unicode和UTF-8等常见字符编码格式介绍

    信息存储在计算机中是转换成二进制来存储的,二进制的发明据说是来源于中国阴阳八卦.后德国数理哲学大师莱布尼茨是最早接触中华文化的欧洲人之一,从他的传教士朋友鲍威特寄给他的拉丁文译本<易经>中 ...

  5. rocketmq实现延迟队列精确到秒级实现方案3-时间轮和秒级文件实现

    时间轮和秒级文件实现原理图 这种方案比较简单实现,通过秒级时间,建立对应的文件夹,只要相同的时间超时的消息,就在同一个目录,通过msgid保证文件不重复,等到了时间后,就扫描对应的文件夹的文件,发送到 ...

  6. tomcat容器启动失败疑难问题解决方案

    严重: 子容器启动失败java.util.concurrent.ExecutionException: org.apache.catalina.LifecycleException: 初始化组件[or ...

  7. 三张图秒懂Redis集群设计原理

    转载Redis Cluster原理 转载https://blog.csdn.net/yejingtao703/article/details/78484151 redis集群部署方式: 单机 主从 r ...

  8. SpringMVC注解式开发-RequestMapping放到类上

    功能一:请求地址公共部分,模块名称 (放在类) 功能二:

  9. 如何快速写出高质量的 Go 代码?

    前言 团队协作开发中,必然存在着不同的代码风格,并且诸如 http body close,unhandled error 等低级错误不能完全避免.通过使用 ci lint 能够及早的发现并修复问题,提 ...

  10. Kubernetes常见的部署方案(十四)

    一.常见的部署方案 滚动更新 服务不会停止,但是整个pod会有新旧并存的情况. 重新创建 先停止旧的pod,然后再创建新的pod,这个过程服务是会间断的. 蓝绿 (无需停机,风险较小) 部署v1的应用 ...