操作线程的方法

news2024/11/26 9:33:54

文章目录

  • 前言
  • 一、线程的生命周期
  • 二、线程的操作方法
    • 1.休眠
    • 2.加入
    • 3.中断
    • 4.礼让
  • 总结

前言

        将线程看作一个生命的开始和结束,更好理解它各个状态的变化。同时该文会介绍操作线程的主要方法来控制线程的生命周期。这些方法的使用和线程生命周期的变化是密切相关的。


一、线程的生命周期

        线程的生命周期有七种状态,分别为出生状态、就绪状态、运行状态、等待状态、休眠状态、阻塞状态和死亡状态。

        出生状态:该线程实例化之后,调用start()方法之前,都是出生状态。

        就绪状态:当调用start()方法之后,线程得到系统资源分配之前,都是就绪状态。 

        运行状态:得到系统资源分配后,都是运行状态(除非遇到操作线程的方法干预)。

        等待状态:在运行状态下调用Thread类的wait()方法,线程此时处于等待状态。若要结束等待,需要调用Thread类的notify方法。结束所有线程的等待状态,调用Thread类的notifyAll()方法。

        休眠状态:在运行状态下调用Thread类的sleep()方法,线程此时处于休眠状态。

        阻塞状态:在运行状态下线程发起输入或输出的请求,在完成输入或输出动作前,线程都处于阻塞状态,无法恢复运行。

        死亡状态:线程的run()方法执行完毕后,线程运行结束,线程死亡,释放系统资源。

二、线程的操作方法

1.休眠

        所谓休眠,就是让线程暂停运行多长时间,多长时间靠输入的值决定。 

        使线程休眠的方法,就是调用sleep()方法。而sleep()方法需要一个int参数用来指定该线程休眠的时间。

        sleep()方法的语法如下:

try{
    Thread.sleep(int值);
    //int值代表毫秒
}catch(InterruptedException){
    e.printStrackTrace();
}

使用sleep()方法休眠线程时,需要注意两点:

        (1)要用到try-catch语句,给sleep()方法报错。

        (2)输入的int值对应该线程休眠几毫秒

        实操展示:

public class lon extends Thread{
    
    public void run(){
        for(int i=0;i<10;i++){
            System.out.println(i);
            try {
                Thread.sleep(2000);
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
        
    }
    public static void main(String[] args) {
        new lon().start();;
    }
}

        运行结果:

 

        运行此线程时,本该一瞬间输出完0到9这几个数据,由于调用了Thread类的sleep()方法,线程每输出一个值就会休眠两秒。 

2.加入

        所谓加入,就是一个线程在运行的过程中,在某个点加入另一个线程。加入的线程运行完毕,死亡后,原本的线程再继续运行。

        使线程加入,就要调用Thread类的join()方法。

        join()方法的语法如下:

线程对象.join();
//这里是 线程对象 加入另外的正运行的线程对象
线程对象.join(long millis);
//该线程对象要过多少millis毫秒再加入线程中

        实操展示:创建窗体,上面显示两个进度条,两个线程对应两个进度条,上面的进度条进度为50时,调用join()方法下方进度条线程加入上方进度条进程,两进程合二为一,下方加入的进程运行完毕后,上方进程再继续运行结束。

import java.awt.*;
import javax.swing.*;

public class lon extends JFrame{
    private Thread threadA , threadB;
    final JProgressBar progressBar = new JProgressBar();
    final JProgressBar progressBar2 = new JProgressBar();
    int count =0;

    public static void init(JFrame jFrame,int width,int height){
        jFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        jFrame.setSize(width, height);
        jFrame.setVisible(true);
    }

    public lon(){
        super();
        getContentPane().add(progressBar,BorderLayout.NORTH);
        getContentPane().add(progressBar2,BorderLayout.SOUTH);
        progressBar.setStringPainted(true);
        progressBar2.setStringPainted(true);
        threadA = new Thread(new Runnable(){    
//创建了一个新的Thread对象,并使用一个实现了Runnable接口的匿名内部类来初始化它。
            int count=0;
            public void run(){
                while (true) {
                    progressBar.setValue(++count); 
                    try {
                        Thread.sleep(100);
                        if(count==50){
                            threadB.join();
                        }
                    } catch (Exception e) {
                        e.printStackTrace();
                    }                   
                }
            }
        });
        threadA.start();

        threadB=new Thread(new Runnable() {
           int count =0;
           public void run(){
                while (true) {
                    progressBar2.setValue(++count);
                    try {
                        Thread.sleep(100);
                    } catch (Exception e) {
                        e.printStackTrace();
                    }
                    if (count==100) {
                        break;
                    }
                }
           }
        });
        threadB.start();
    }
    
    public static void main(String[] args) {
        init(new lon(), 100, 100);
    }
}

        运行结果:

        如上图所示,开发时,只需要再一个线程的run()方法中对应的位置调用join()方法引入另一个进程,就会实现中途插入新进程,运行完后,继续旧进程的效果。 

3.中断

       所谓中断,就是让线程在指定的运行地方中断运行。和线程休眠不同的是,没有固定时间来恢复运行。

        使线程中断,就要调用Thread类中的interrupt()方法,使得线程离开了run()方法。结束线程的同时,程序也会抛出 InterruptedException异常,要用try-catch语句捕获异常,开发者在catch语句中要写好对应的处理代码。

         interrupted()方法的语法如下:

try{
    线程对象.interrupt();
}catch(InterruptedException e){
    System.out.println("线程被中断");
}

        实操展示:

import java.awt.*;
import javax.swing.*;

public class lon extends JFrame {
    private Thread threadA;
    final JProgressBar progressBar = new JProgressBar();
    int count = 0;

    public static void init(JFrame jFrame, int width, int height) {
        jFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        jFrame.setSize(width, height);
        jFrame.setVisible(true);
    }

    public lon() {
        super();
        getContentPane().add(progressBar, BorderLayout.NORTH);
        progressBar.setStringPainted(true);
        threadA = new Thread(new Runnable() {
            int count = 0;

            public void run() {
                while (true) {
                    progressBar.setValue(++count);
                    try {
                        Thread.sleep(100);
                        if (count == 50) {
                            threadA.interrupt(); // 中断当前线程
                        }
                    } catch (InterruptedException e) {
                        System.out.println("线程被中断");
                        e.printStackTrace();
                        break; // 退出循环
                    } catch (Exception e) {
                        e.printStackTrace();
                    }
                }
            }
        });
        threadA.start();
    }

    public static void main(String[] args) {
        init(new lon(), 100, 100);
    }
}

        运行结果:

         由上图所示,当一个线程调用了interrupt()方法,这个线程就会中止运行。若想恢复运行,需要在catch语句中自行编写对应功能的代码。

4.礼让

        所谓礼让,就是暗示线程在某一运行过程中可以暂时将系统资源礼让给其他线程。这个操作线程的方法有个弊端,不能保证运行至代码处,该线程一定会礼让,因为操作系统给各个线程自动分配时间片,有些操作系统,线程的调度不可预测。所以说线程的礼让,打个比方就是,公交车上年轻人给老人让座,但不一定每个年轻人都让座。

        使线程礼让,就要调用Thread类中的yield()方法。该方法使得线程比其他相同级别的线程,更优先的资源分配。

        yield()方法的语法如下:

线程对象.yield();

         礼让的内容想要深入了解的小伙伴可以自行网上搜索。


总结

        以上就是操作线程的方法的介绍,本文仅仅简单介绍了操作线程方法的使用,而熟练地使用线程开发项目是一个徐徐渐进,日进斗金的功夫活。文章中有不足或要补充的内容,欢迎小伙伴们在评论区中留言。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1941371.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

甄选范文“论面向方面的编程技术及其应”,软考高级论文,系统架构设计师论文

论文真题 针对应用开发所面临的规模不断扩大、复杂度不断提升的问题,面向方面的编程(Aspect Oriented Programming,AOP)技术提供了一种有效的程序开发方法。为了理解和完成一个复杂的程序,通常要把程序进行功能划分和封装。一般系统中的某些通用功能,如安全性、持续性、日…

Intellij IDEA 的Plugins加载不出来的解决方法

一、点开插件---右上角设置---HTTP代理设置 二、勾选自动检测代理设置 输入url&#xff1a; https://plugins.jetbrains.com/ 配置完成后&#xff0c;点击确定。 然后点击检查连接&#xff0c;再一次输入那个URL&#xff0c;一般来说可以连接成功了 然后 重启IDEA以刷新缓…

详解数据结构之二叉树(堆)

详解数据结构之二叉树(堆) 树 树的概念 树是一个非线性结构的数据结构&#xff0c;它是由 n(n>0)个有限节点组成的一个具有层次关系的集合&#xff0c;它的外观形似一颗倒挂着的树&#xff0c;根朝上&#xff0c;叶朝下&#xff0c;所以称呼为树。每颗子树的根节点有且只…

7. 聚类算法 KMeans

聚类算法 KMeans 1. 应用&#xff1a;大数据杀熟2. 迭代法3. 代码 1. 应用&#xff1a;大数据杀熟 618、双十一&#xff0c;平台要对用户进行分类&#xff1a;用户&#xff1a; 脑残粉&#xff08;不降价&#xff0c;或者涨点价&#xff09;墙头草&#xff08;给点小优惠券&am…

二叉树基础及实现(一)

目录&#xff1a; 一. 树的基本概念 二. 二叉树概念及特性 三. 二叉树的基本操作 一. 树的基本概念&#xff1a; 1 概念 &#xff1a; 树是一种非线性的数据结构&#xff0c;它是由n&#xff08;n>0 &#xff09;个有限结点组成一个具有层次关系的集合。 把它叫做树是因…

数据结构之初始二叉树(4)

找往期文章包括但不限于本期文章中不懂的知识点&#xff1a; 个人主页&#xff1a;我要学编程(ಥ_ಥ)-CSDN博客 所属专栏&#xff1a;数据结构&#xff08;Java版&#xff09; 二叉树的基本操作 二叉树的相关刷题&#xff08;上&#xff09;通过上篇文章的学习&#xff0c;我们…

基于密钥的身份验证(Linux-Linux)

A主机&#xff1a; 1、生成密钥对 [rootservera ~]# ssh-keygen查看公钥 注&#xff1a;id_rsa为私钥&#xff08;证书&#xff09;&#xff0c;id_rsa.pub为公钥 2、注册公钥到服务器 [rootservera ~]# ssh-copy-id root172.25.250.106 查看.ssh 3、使用密钥连接服务器 #…

ViT(Vision Transformer)网络结构详解

本文在transformer的基础上对ViT进行讲解&#xff0c;transformer相关部分可以看我另一篇博客&#xff08;transformer中对于QKV的个人理解-CSDN博客&#xff09;。 一、网络结构概览 上图展示了Vision Transformer (ViT) 的基本架构&#xff0c;我按照运行顺序分为三个板块进…

配置web服务器

当访问网站www.haha.com时显示&#xff1a;haha&#xff1b;当访问网站www.xixi.com/secret/显示&#xff1a;this is secret 第一步&#xff0c;配置一个新的IP 确认后 esc返回 第二步&#xff1a;重启ens160 第三步&#xff1a;创建目录&#xff0c;并且在文件内写入内容 第…

英福康INFICON UL1000检漏仪介绍PPT

英福康INFICON UL1000检漏仪介绍PPT

【周记】2024暑期集训第二周(未完待续)

文章目录 日常刷题记录合并果子题目解析算法思路代码实现 中位数题目解析算法思路代码实现 C学习笔记队列queue双端队列 deque优先队列 priority_queue定义常见操作 upper_bound 日常刷题记录 合并果子 题目解析 有一堆果子&#xff0c;每次可以将两小堆合并&#xff0c;耗费…

verilog行为建模(四):过程赋值

目录 1.两类过程赋值2.阻塞与非阻塞赋值语句行为差别举例13.阻塞与非阻塞赋值语句行为差别举例24.阻塞与非阻塞赋值语句行为差别举例35.举例4&#xff1a;非阻塞赋值语句中延时在左边和右边的差别 微信公众号获取更多FPGA相关源码&#xff1a; 1.两类过程赋值 阻塞过程赋值执…

漫威争锋Marvel Rivals测试搜不到 漫威争锋Marvel Rivals怎么搜

漫威争锋&#xff0c;一款今年即将上线的6v6的fps游戏&#xff0c;漫威争锋Marvel Rivals一经公布就吸引了广大玩家的兴趣。玩家将在游戏中扮演一名名经典且有趣的漫威英雄&#xff0c;与敌人展开对决。而且该游戏中有着很多的漫威英雄供我们挑选使用&#xff0c;有着很多英雄的…

【数据结构】排序算法——Lessen1

Hi~&#xff01;这里是奋斗的小羊&#xff0c;很荣幸您能阅读我的文章&#xff0c;诚请评论指点&#xff0c;欢迎欢迎 ~~ &#x1f4a5;&#x1f4a5;个人主页&#xff1a;奋斗的小羊 &#x1f4a5;&#x1f4a5;所属专栏&#xff1a;C语言 &#x1f680;本系列文章为个人学习…

音乐播放器的优雅之选,黑金ONIX Overture XM5,更悦耳的音质体验

如今想要随时沉浸式的体验高品质的数字音乐资源&#xff0c;一款简单好用的音乐播放器必不可少&#xff0c;多年来在音乐爱好者的心中的经典品牌屈指可数&#xff0c;英国品牌ONIX算是一个&#xff0c;其Horizon系列以优雅的设计以及出众的品质&#xff0c;收获了很多忠实粉丝。…

OpenAI发布迷你AI模型GPT-4o mini

本心、输入输出、结果 文章目录 OpenAI发布迷你AI模型GPT-4o mini前言OpenAI发布迷你AI模型GPT-4o mini英伟达联合发布 Mistral-NeMo AI 模型:120 亿参数、上下文窗口 12.8 万个 tokenOpenAI发布迷你AI模型GPT-4o mini 编辑 | 简简单单 Online zuozuo 地址 | https://blog.csd…

【ADRC笔记】LESO-Wb

公式推导(bilibili) 一阶ESO 二阶ESO 二阶自抗扰控制器基本原理 选取状态变量 观测器收敛性推导 wo 观测器带宽

C语言·函数(超详细系列·全面总结)

前言&#xff1a;Hello大家好&#x1f618;&#xff0c;我是心跳sy&#xff0c;为了更好地形成一个学习c语言的体系&#xff0c;最近将会更新关于c语言语法基础的知识&#xff0c;今天更新一下函数的知识点&#xff0c;我们一起来看看吧&#xff01; 目录 一、函数是什么 &a…

HTTPServer改进思路1

Nginx源码思考项目改进 架构模式 事件驱动架构(EDA&#xff09;用于处理大量并发连接和IO操作 优点&#xff1a;高效处理大量并发请求&#xff0c;减少线程切换和阻塞调用技术实现&#xff1a;直接使用EPOLL&#xff0c;参考Node.js的http服务器 网络通信 协议&#xff1a;HTT…

day6 io线程

获取终端输入的字符