java多线程-线程的状态和线程常用方法(代码片段)

小花皮猪 小花皮猪     2022-12-08     242

关键词:

线程共有五大状态

1 创建
线程对象被创建就进入到新状态(new)

2 就绪
调用线程的start()方法,线程进入就绪状态

3 运行
线程进入运行状态,开始执行线程体代码

4 阻塞
调用sleep,wait等方法时,线程进入阻塞状态,线程不再继续往下执行,阻塞事件解除后,重新进入就绪状态,等待cpu调度执行

5 死亡
线程中断或者结束,一旦进入死亡状态,就不能再次启动线程

线程方法

停止线程

注意:

1 不推荐使用jdk提供的stop(),destroy()方法(已废弃)

2 推荐线程自己停下来

3 建议使用一个标志位进行终止变量,当flag=false时,则终止线程运行

package com.wyh.thread;

/**
 * @program: Thread
 * @description: 利用flag让线程停止
 * @author: 魏一鹤
 * @createDate: 2022-01-01 22:38
 **/

//测试线程停止
// 注意点
// 1、建议线程正常停止---> 利用次数 不建议死循环(就算是死循环也要定义延时,不要跑的太快卡死cpu)
// 2. 建议使用标志位 --->  设置一个标志位
// 3. 不要使用stop或者destroy等过时或者jdk不建议使用的方法
public class TestThreadStop  implements  Runnable
    //1.定义一个标识符决定线程是否运行 true为运行 false为停止
    private boolean flag=true;
    @Override
    public void run() 
        int i=0;
        // true为运行 false为停止
        while (flag)
            System.out.println("run....Thread"+i++);
        
    

    //2.定义一个方法转换标识符停止线程
    public void stopThread() 
        //false让线程停止
        this.flag=false;
    

    public static void main(String[] args)
        //创建线程对象
        TestThreadStop testThreadStop = new TestThreadStop();
        //开启线程
        new Thread(testThreadStop).start();
        for (int i = 0; i < 1000; i++) 
            //主线程跑的次数
            System.out.println("main:"+i);
            if(i==900)
                //线程运行900次让线程停止   调用stop方法切换标志位,让线程停止
                testThreadStop.stopThread();
                System.out.println("线程该停止了");
            
        
    



线程休眠 sleep

  1. sleep(时间)指定当前线程阻塞的毫秒数(1000hs(毫秒)=1s(秒),一般一秒就够用)
  2. sleep存在异常interruptedException
  3. sleep时间达到后线程进入就绪状态
  4. sleep可以模拟网络延时,倒计时等
  5. 每一个对象都有一个锁,sleep不会释放锁(线程同步)

线程休眠的作用(模拟网络延时): 放大问题的发生性
我们还是拿买票的例子演示

package com.wyh.thread;

/**
 * @program: Thread
 * @description: 线程休眠(阻塞) 模拟网络延时
 * @author: 魏一鹤
 * @createDate: 2022-01-02 20:13
 **/

//模拟网络延时
//作用    1 放大问题的发生性
public class TestThreadSleep implements Runnable 
    //票数
    int ticketNums=10;
    @Override
    public void run() 
        //火车票抢票
        while (true) 
            //如果没票了就停止
            if(ticketNums<=0)
                break;
            
            //模拟延迟
            try 
                Thread.sleep(100);
             catch (InterruptedException e) 
                e.printStackTrace();
            
            //Thread.currentThread().getName() 获取当前线程名称 我们是可以给线程命名的
            System.out.println(Thread.currentThread().getName() + "-->抢到了"+ticketNums--+"张票");
        
    
    public static void main(String[] args)
        //创建runnable接口的实现类对象
        TestThreadSleep testThreadSleep = new TestThreadSleep();
        //3个线程一起去抢票
        new Thread(testThreadSleep,"魏一鹤").start();
        new Thread(testThreadSleep,"魏一鸣").start();
        new Thread(testThreadSleep,"黄牛党").start();

    


模拟倒计时

package com.wyh.thread;

/**
 * @program: Thread
 * @description: 模拟倒计时
 * @author: 魏一鹤
 * @createDate: 2022-01-02 20:22
 **/

public class TestThreadSleep2 

    //倒计数方法
    public static void TimeDown() throws InterruptedException 
        //初始化秒数
        int timeNum=10;
        while (true)
            //线程休眠1s  1000ms=1s
            Thread.sleep(1000);
            //自减
            System.out.println(timeNum--);
            //倒到0时候停止
            if(timeNum==0)
                System.out.println("倒计时结束!");
                break;
            
        
    
    public static void main(String[] args) throws InterruptedException 
        TimeDown();
    


每1s获取当前系统时间

package com.wyh.thread;

import java.text.Format;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.SimpleTimeZone;

/**
 * @program: Thread
 * @description: 打印当前时间
 * @author: 魏一鹤
 * @createDate: 2022-01-02 20:32
 **/

public class TestThreadSleep3 
    //打印当前系统时间
    public static void main(String[] args) throws InterruptedException 
        //获取当前系统时间
       Date date = new Date(System.currentTimeMillis());
      while (true) 
          Thread.sleep(1000);
          System.out.println("当前时间:"+new SimpleDateFormat("HH:mm:ss").format(date));
          //更新当前时间
          date=new Date(System.currentTimeMillis());
      
    


总结sleep的特点和作用

  1. 模拟网络延迟
  2. 倒计时
  3. sleep不会释放锁(线程同步)
  4. sleep存在异常interruptedException
  5. sleep时间达到后线程进入就绪状态
  6. sleep(时间)指定当前线程阻塞的毫秒数(1000hs(毫秒)=1s(秒),一般一秒就够用

线程礼让(yield)

  1. 礼让线程,让当前允许的线程暂停,但不阻塞
  2. 让线程从运行的状态转换为就绪状态
  3. 让cpu重新调度,礼让不一定会成功,看cpu心情!
package com.wyh.thread;

/**
 * @program: Thread
 * @description: 线程礼让
 * @author: 魏一鹤
 * @createDate: 2022-01-02 20:59
 **/

//测试线程礼让 礼让不一定成功 只是让线程回到同一起跑线
public class TesThreadYield 
    public static void main(String[] args)
        //创建线程执行体
        ThreadYield threadYield=new ThreadYield();
        new Thread(threadYield,"线程A").start();
        new Thread(threadYield,"线程B").start();
    

class ThreadYield implements  Runnable

    @Override
    public void run() 
        System.out.println(Thread.currentThread().getName()+"开始执行");
        //线程礼让
        Thread.yield();
        System.out.println(Thread.currentThread().getName()+"结束执行");
    


线程强制执行(join)

  1. join合并线程,待此线程执行完成后,再开始执行其他线程,在此期间其他线程只能阻塞等待
  2. 可以把他想象成插队
  3. 需要被捕获异常InterruptedException
package com.wyh.thread;

/**
 * @program: Thread
 * @description: 线程join强制插队
 * @author: 魏一鹤
 * @createDate: 2022-01-03 21:27
 **/

//线程join测试  可以把它想象成插队
public class TestThreadJoin implements  Runnable

    @Override
    public void run() 
        for (int i = 0; i < 1000; i++) 
            System.out.println("vip来了"+i);
        
    
    public static void main(String[] args) throws InterruptedException 
        //启动线程
        TestThreadJoin testThreadJoin = new TestThreadJoin();
        Thread thread = new Thread(testThreadJoin);
        thread.start();
        for (int i = 0; i < 500; i++) 
            //如果i==500 让run线程插队执行,main方法阻塞等待,等run方法执行完之后再执行
            if(i==200)
                thread.join();
            
            System.out.println("main启动线程"+i);
        
    


java多线程(详细了解java多线程机制)(代码片段)

每天进步一点点一、程序、进程、线程1.1什么是程序1.2什么是进程1.3什么是线程1.4进程和线程的区别二、创建线程的三种方式2.1继承Thread类重写run()方法具体实现获取线程ID和名称修改线程名称2.2实现Runnable接口实现run()方法具体... 查看详情

juc学习之java线程常用方法(代码片段)

JUC学习之Java线程常用方法Java线程方法一,直接使用Thread方法二,使用Runnable配合ThreadJava8以后可以使用lambda精简代码原理之Thread与Runnable的关系方法三,FutureTask配合Thread查看进程线程的方法windowsJavalinuxjconsole远程监控... 查看详情

java多线程(代码片段)

多线程进程其他相关概念创建线程的两种方式为什么使用start()方法而不直接使用run()方法start()方法底层继承Thread和实现Rnnable的区别售票系统SellTicket01类继承Thread实现SellTicket02类实现Runnable接口线... 查看详情

java多线程基础(代码片段)

目录实现多线程的两种基础方式方式一:继承Thread类方式二:实现Runnable接口线程常用方法线程优先级设置线程的插队和礼让线程的中断守护线程 线程同步多线程时间比较实现多线程的两种基础方式方式一:继承Threa... 查看详情

多线程线程状态和案例演示(代码片段)

线程的几种状态初始(NEW):新创建了一个线程对象,但还没有调用start()方法运行(RUNNABLE):Java线程中将就绪(ready)和运行中(running)两种状态笼统的称为“运行”阻塞(BLOCKED):表示线程阻塞于锁等待(WAITING):进入该... 查看详情

java多线程入门中几个常用的方法(代码片段)

一.currentThread()方法 currentThread方法就是返回当前被调用的线程。 该方法为一个本地方法,原码如下:/***Returnsareferencetothecurrentlyexecutingthreadobject.**@returnthecurrentlyexecutingthread.*/publicstaticnativeThreadcurre 查看详情

java多线程中用到的方法详细解析(代码片段)

在多线程学习的过程中涉及的方法和接口特别多,本文就详细讲解下经常使用方法的作用和使用场景。1.sleep()方法。    当线程对象调用sleep(time)方法后,当前线程会等待指定的时间(time),并让出cpu执行权,但是... 查看详情

多线程原理和常用方法以及thread和runnable的区别(代码片段)

多线程原理随机性打印CPU有了两条执行的路径,CPU就有了选择,一会执行main方法一会执行run方法。也可以说两个线程,一个main线程一个run线程一起请求CPU的执行权(执行时间)谁抢到了就执行对应的代码多线程内存图解main方法... 查看详情

java多线程——thread类及常见方法和线程的基本操作(代码片段)

文章目录一、Thread的常见构造方法二、Thread常见属性1.线程名字2.线程的状态3.优先级4.后台线程5.线程是否存活三、线程的基本操作1.start(启动线程)2.Sleep(休眠线程)3.currentThread(获取当前线程引用)4.i... 查看详情

java多线程之线程运行状态(代码片段)

java线程的状态一共有6种,如下所示NEW:初始状态,线程被构建,但是还没有调用start()方法RUNNABLE:运行状态,java线程将操作系统中的就绪和运行两种状态笼统的称作运行态BLOCKED:阻塞状态,表示线程... 查看详情

java基础——多线程(代码片段)

文章目录1、线程、进程、多任务多任务多线程程序(进程)多进程与多线程的区别多线程解释2、线程状态1.新线程创建(new)三种创建方式:(只关注前两种)方法1方法2总结方法三(了解即可)2.线程停... 查看详情

java多线程并发02——线程的生命周期与常用方法

线程生命周期一个线程不是被创建了马上就开始执行,也不是一直处于执行状态。在线程的整个生命周期中会经历新建(New)、就绪(Runnable)、运行(Running)、阻塞(Blocked)和销毁(Terminated)5种状态。线程全生命周期.PNG新... 查看详情

java多线程二线程间通信(代码片段)

线程间通信:多个线程在处理同一资源,但是 等待唤醒机制涉及的方法:1、wait()让线程处于冻结状态,被wait的线程会被存储到线程池中。 2、notify()唤醒线程池中的一个线程(任意)3、notifyAll()唤醒线程池中的所有线程... 查看详情

java中多线程安全性和同步的常用方法

1、多线程安全性问题,即多线程在什么场景下会出现异常?多个线程同时调用一个共享的变量(对象),比如当某个线程操作车票的过程中,尚未操作完成时,其他线程参与进来,也操作车票。 2、在Java中,我们通过同步机... 查看详情

多线程多线程基础知识(代码片段)

文章目录1.认识线程(Thread)2.Thread类及常见方法2.1Thread常见构造方法2.2start和run方法的区别2.3Thread常见属性2.4中断线程2.5等待线程2.6休眠线程3.线程的状态3.1线程的所有状态3.2线程状态转移图1.认识线程(Thread)进... 查看详情

多线程多线程基础知识(代码片段)

文章目录1.认识线程(Thread)2.Thread类及常见方法2.1Thread常见构造方法2.2start和run方法的区别2.3Thread常见属性2.4中断线程2.5等待线程2.6休眠线程3.线程的状态3.1线程的所有状态3.2线程状态转移图1.认识线程(Thread)进... 查看详情

java多线程编程——多线程技能(代码片段)

第一章Java多线程技能文章目录第一章Java多线程技能前言一、进程和多线程概述二、使用多线程1.继承Thread类2.线程随机性的展现3.实现Runnable接口4.使用Runnable接口实现多线程的优点5.实例变量共享造成的非线程安全问题与解决方... 查看详情

整理c#多线程常用的几个对象和方法(代码片段)

...hread几个中要的方法   Sleep(int):静态方法,暂停当前线程指定的毫秒数   Abort():通常使用该方法来终止一个线程 ,Thread.ResetAbort()可以恢复终止的线程   Suspend():不是终止未完成的线程,它仅仅是挂起线程,还... 查看详情