java多线程--3 线程状态、线程方法、线程类型

线程状态

  • 创建状态:

  • **就绪状态: **

    • 进入状态:

      1. 创建状态:启动线程
      2. 阻塞状态:阻塞解除
      3. 运行状态:释放CPU资源
  • 阻塞状态:

    • 进入状态:

      1. 运行状态:等待用户输入、线程休眠等
  • 运行状态:

    • 进入状态:

      1.就绪状态:获得CPU资源

  • 死亡状态:

    • 进入状态:

      1.运行状态:线程自然执行完毕、外部干涉终止线程。

线程方法

方法 说明
setPrioity(int newPriority) 更改线程的优先级
static void sleep(long millis) 在指定的毫秒数内让当前正在执行的线程休眠
void join() 等待线程终止
static void yield() 暂停当前正在执行的线程对象,并执行其他线程
void interrupt() 中断线程,别用这种方式
boolean isAlive() 测试线程是否处于活动状态

终止线程

  • 不推荐使用JDK提供的stop()、destroy() 。 已经废弃
  • 推荐线程自己停止下来,建议使用一个标志位进行终止线程,当flag = false,则终止线程运行。
package com.ssl.demo03;

//测试stop
//1.建议线程正常停止----->利用次数,不建议死循环
//2.建议使用标志位----->设置一个标志位
//3.不要使用stop或者destroy等过时或者JDK不建议使用的方法 public class TestStop implements Runnable{ //1.设置一个标志位
private boolean flag = true; @Override
public void run() {
int i = 0;
while(flag){
System.out.println("run.....Thread"+i++);
}
} //2.设置一个公开的方法停止线程,转换标志位
public void stop(){
this.flag = false;
}
public static void main(String[] args) { TestStop testStop = new TestStop(); new Thread(testStop).start(); for (int i = 0; i < 1000; i++) {
System.out.println("main:"+i);
if (i == 900){
//调用stop方法,切换标志位,让线程终止
testStop.stop();
System.out.println("线程该停止了");
}
} }
}

线程休眠 sleep

  • sleep(时间) 指定当前线程阻塞的毫秒数;
  • sleep存在异常InterruptedException;
  • sleep时间达到后,线程进入就绪状态;
  • sleep可以模拟网络延时,倒计时等;
  • 每个对象都有一个锁,sleep不会释放锁。

模拟网络延时 存在不安全问题,后面解决

package com.ssl.demo03;

import com.ssl.demo01.TestThread5;

public class TestSleep implements Runnable{

    //票数
private int ticketNums = 10; @Override
public void run() {
while (true) {
if(ticketNums==0)
break;
//模拟延时,会存在并发问题
try {
Thread.sleep(100);
} catch (InterruptedException e) {
throw new RuntimeException(e);
}
//得到当前线程的名字
System.out.println(Thread.currentThread().getName()+"拿到了第"+ticketNums--+"票");
}
} public static void main(String[] args) {
TestThread5 tickle = new TestThread5(); Thread thread1 = new Thread(tickle,"小明");
Thread thread2 = new Thread(tickle,"大黄");
Thread thread3 = new Thread(tickle,"老师");
Thread thread4 = new Thread(tickle,"黄牛党"); thread1.start();
thread2.start();
thread3.start();
thread4.start(); } }

模拟倒计时

  1. 倒计时10s
package com.ssl.demo03;

public class TestSleep2 {

    public static void main(String[] args){
try {
tenDown();
} catch (InterruptedException e) {
throw new RuntimeException(e);
}
}
public static void tenDown() throws InterruptedException {
int num =10 ;
while(true){
Thread.sleep(1000);
System.out.println(num--);
if(num<=0){
break;
}
}
}
}
  1. 显示当前时间
package com.ssl.demo03;

import java.text.SimpleDateFormat;
import java.util.Date; public class TestSleep3 {
public static void main(String[] args) {
//打印当前系统时间
Date startTime = new Date(System.currentTimeMillis());//获取系统当前时间
while(true){
try {
Thread.sleep(1000);
System.out.println(new SimpleDateFormat("HH:mm:ss").format(startTime));
startTime = new Date(System.currentTimeMillis()); //更新当前时间
} catch (InterruptedException e) {
throw new RuntimeException(e);
}
}
}
}

线程礼让yield

  • 礼让线程,让当前正在执行的线程暂停,但不阻塞
  • 将线程从运行状态转为就绪状态
  • 让cpu重新调度,礼让不一定成功!看cpu心情
package com.ssl.demo03;

//测试礼让线程
//礼让不一定成功,看cpu心情
public class TestYield { public static void main(String[] args) {
MyYield myYield = new MyYield(); new Thread(myYield,"a").start();
new Thread(myYield,"b").start(); } } class MyYield implements Runnable{
@Override
public void run() {
System.out.println(Thread.currentThread().getName()+"线程开始执行");
Thread.yield(); //礼让
System.out.println(Thread.currentThread().getName()+"线程停止执行");
}
}

线程强制执行 join

  • join合并线程,待此线程执行完成后,在执行其他线程,其他线程阻塞。
  • 类似插队,少用,因为会阻塞其他线程
package com.ssl.demo03;

public class TestJoin implements Runnable{
@Override
public void run() {
for (int i = 0; i < 1000; i++) {
System.out.println("线程VIP来了"+i);
}
} public static void main(String[] args) {
TestJoin testJoin = new TestJoin(); Thread thread = new Thread(testJoin);
thread.start(); //主线程
for (int i = 0; i < 500; i++) {
if (i==200) {
try {
thread.join();
} catch (InterruptedException e) {
throw new RuntimeException(e);
}
}
System.out.println("mian"+i);
}
}
}

观察测试线程的状态 静态方法getState()

一个线程只能启动一次

package com.ssl.demo03;

//观察测试线程的状态
public class TestState { public static void main(String[] args) {
Thread thread = new Thread(()->{
for (int i = 0; i < 5; i++) {
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
throw new RuntimeException(e);
}
}
System.out.println("////////");
}); //观察状态
Thread.State state = thread.getState();
System.out.println(state); thread.start();
state = thread.getState();
System.out.println(state); while (state != Thread.State.TERMINATED){ //只要线程一直不终止,就一直输出状态
try {
Thread.sleep(100);
} catch (InterruptedException e) {
throw new RuntimeException(e);
}
state = thread.getState();
System.out.println(state);
} }
}

线程的优先级 priority

  • Java提供一个线程调度器来监控程序中启动后进入就绪状态的所有线程,线程调度器按照优先级决定应该调度哪个线程来执行。
  • 线程优先级用数字表示,范围从1-10,也看CPU心情,优先级高的只是有优势
Thread.MIN_PRIORITY = 1;
Thread.MAX_PRIORITY = 10;
Thread.NORM_PRIORITY = 5;
  • 方法

    • 改变优先级:setPriority(int xxx)
    • 获取优先级:getPriority()
package com.ssl.demo03;

//测试线程优先级
public class TestPriority {
public static void main(String[] args) {
//主线程默认优先级
System.out.println(Thread.currentThread().getName()+"-->"+Thread.currentThread().getPriority()); MyPriority myPriority = new MyPriority(); Thread t1 = new Thread(myPriority,"t1");
Thread t2 = new Thread(myPriority,"t2");
Thread t3 = new Thread(myPriority,"t3");
Thread t4 = new Thread(myPriority,"t4");
Thread t5 = new Thread(myPriority);
Thread t6 = new Thread(myPriority);
t2.setPriority(1);
t3.setPriority(4);
t4.setPriority(Thread.MAX_PRIORITY); t1.start();
t2.start();
t3.start();
t4.start();
//报错
/* 超出范围1-10
t5.setPriority(-1);
t5.start();
t6.setPriority(11);
t6.start();
*/
}
} class MyPriority implements Runnable{ @Override
public void run() {
System.out.println(Thread.currentThread().getName()+"-->"+Thread.currentThread().getPriority());
}
}

守护线程 daemon

  • 线程分为用户线程和守护线程
  • 虚拟机必须确保用户线程执行完毕
  • 虚拟机不用等待守护线程执行完毕,如,后台操作日志、监控内存、垃圾回收....
package com.ssl.demo03;

//测试守护线程
public class TestDaemon {
public static void main(String[] args) {
God god = new God();
You you = new You();
Thread thread = new Thread(god);
thread.setDaemon(true); //默认是false表示用户线程
thread.start(); //守护线程启动
new Thread(you).start();
} } //上帝
class God implements Runnable{ @Override
public void run() {
while(true){
System.out.println("上帝保佑着你");
}
}
} //你
class You implements Runnable{ @Override
public void run() {
for (int i = 0; i < 36500; i++) {
System.out.println("开心的活着");
}
System.out.println("======goodbye!world!");
}
}

java多线程--3 线程状态、线程方法、线程类型的更多相关文章

  1. “全栈2019”Java多线程第十章:Thread.State线程状态详解

    难度 初级 学习时间 10分钟 适合人群 零基础 开发语言 Java 开发环境 JDK v11 IntelliJ IDEA v2018.3 文章原文链接 "全栈2019"Java多 ...

  2. “全栈2019”Java多线程第七章:等待线程死亡join()方法详解

    难度 初级 学习时间 10分钟 适合人群 零基础 开发语言 Java 开发环境 JDK v11 IntelliJ IDEA v2018.3 文章原文链接 "全栈2019"Java多 ...

  3. “全栈2019”Java多线程第六章:中断线程interrupt()方法详解

    难度 初级 学习时间 10分钟 适合人群 零基础 开发语言 Java 开发环境 JDK v11 IntelliJ IDEA v2018.3 文章原文链接 "全栈2019"Java多 ...

  4. Java多线程系列--“基础篇”06之 线程让步

    概要 本章,会对Thread中的线程让步方法yield()进行介绍.涉及到的内容包括:1. yield()介绍2. yield()示例3. yield() 与 wait()的比较 转载请注明出处:ht ...

  5. Java多线程系列--“基础篇”07之 线程休眠

    概要 本章,会对Thread中sleep()方法进行介绍.涉及到的内容包括:1. sleep()介绍2. sleep()示例3. sleep() 与 wait()的比较 转载请注明出处:http:// ...

  6. Java多线程系列--“基础篇”10之 线程优先级和守护线程

    概要 本章,会对守护线程和线程优先级进行介绍.涉及到的内容包括:1. 线程优先级的介绍2. 线程优先级的示例3. 守护线程的示例 转载请注明出处:http://www.cnblogs.com/skyw ...

  7. Java多线程(三)如何创建线程

    点我跳过黑哥的卑鄙广告行为,进入正文. Java多线程系列更新中~ 正式篇: Java多线程(一) 什么是线程 Java多线程(二)关于多线程的CPU密集型和IO密集型这件事 Java多线程(三)如何 ...

  8. Java多线程(一) 什么是线程

    声明:本系列大多是翻译自https://www.javatpoint.com,加上自己的增删改,尽力写的系统而通俗易懂,后文不再重复声明. 点我跳过黑哥的卑鄙广告行为,进入正文. Java多线程系列更 ...

  9. “全栈2019”Java多线程第十四章:线程与堆栈详解

    难度 初级 学习时间 10分钟 适合人群 零基础 开发语言 Java 开发环境 JDK v11 IntelliJ IDEA v2018.3 文章原文链接 "全栈2019"Java多 ...

  10. java多线程-概念&创建启动&中断&守护线程&优先级&线程状态(多线程编程之一)

    今天开始就来总结一下Java多线程的基础知识点,下面是本篇的主要内容(大部分知识点参考java核心技术卷1): 1.什么是线程以及多线程与进程的区别 2.多线程的创建与启动 3.中断线程和守护线程以及 ...

随机推荐

  1. 模态框拖拽案例分析--元素偏移量 offset 系列

    弹出框,我们也称为模态框. 模态框拖拽案例分析: (1)点击弹出层, 会弹出模态框, 并且显示灰色半透明的遮挡层. (2)点击关闭按钮,可以关闭模态框,并且同时关闭灰色半透明遮挡层. (3)鼠标放到模 ...

  2. ZSTUOJ刷题④:Problem B.--输出双层金字塔

    Problem B: 输出双层金字塔 Time Limit: 1 Sec  Memory Limit: 64 MBSubmit: 7860  Solved: 5834 Description 输出双层 ...

  3. 中国人民公安大学 Chinese people’ public security university 网络对抗技术 实验报告4

    中国人民公安大学 Chinese people' public security university 网络对抗技术 实验报告   实验四 恶意代码技术     学生姓名 陈禹 年级 2018 区队 ...

  4. e.target和this区别

    首先,this是指向当前事件所绑定的元素 e.target指向事件执行时所点击区域的元素, 易混淆点,当鼠标所点击的元素有子元素,e.target指向子元素,若没有,则和this一样指向事件所绑定的事 ...

  5. AS3.0和php数据交互POST方式

    AS3.0和php数据交互POST方式首先打开flash建立一个as3.0的文件拖 textarea和button组建到舞台上分别给两个组件命名:txtcontent和addcontent然后点第一帧 ...

  6. Linux查看进程调用接口跟踪命令strace

    sudo strace -f -p 9022 -e connect

  7. 微信支付 easy wechat 使用

    /*微信小程序的配置信息微信商户信息*/ public function __construct(){ parent::__construct(); $this->OrderModel = ne ...

  8. C语言初级阶段6——自定义数据类型

    C语言初级阶段6--自定义数据类型 阐述 1.构造数据类型:用户自己建立的数据类型(自定义数据类型). 2.C语言中的自定义数据类型:数组类型.结构体类型.共用体类型和枚举类型. 结构体 1.定义:C ...

  9. STM32任意引脚模拟IIC

    关于模拟I2C,任意接口都可模拟(未全部测试,可能存在特殊情况). 关于SDA_IN与SDAOUT:如下定义: 举例:#define MPU_SDA_IN() {GPIOA->CRL&= ...

  10. 洛谷 P2212 [USACO14MAR]Watering the Fields S 题解

    2021-08-03 20:31:13 链接: https://www.luogu.com.cn/problem/P2212 题目详情: Due to a lack of rain, Farmer J ...