多线程 -- Thread类的基本用法

这篇具有很好参考价值的文章主要介绍了多线程 -- Thread类的基本用法。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

本篇重点

  1. 什么是变量捕获??

  2. 有关线程的操作

     线程创建
     线程中断
     线程等待
     线程休眠
     获取线程实例
    

1. 线程创建

关于线程的创建看上篇博客, 里面为线程的创建提供了5种方法

2. 线程中断

线程的中断, 就是让一个线程停下来
本质上来说, 让一个线程终止, 办法就一种, 让该线程的入口方法执行完毕!! (
return 或者 抛出异常等)

  1. 给线程规定一个结束标志位
public class ThreadDemo9 {
    public static boolean isQuit = false;
    public static void main(String[] args) {
        Thread t = new Thread(() -> {
            while (!isQuit) {
                System.out.println("hello t");
                try {
                    Thread.sleep(1000);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
            System.out.println("t 线程终止");
        });
        t.start();
        try {
            Thread.sleep(3000);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        isQuit = true;
    }
}

说白了就是设置一个全局变量, 在三秒的时候, 将isQuit设置成为true, 从而中断线程

变量捕获

一定是要设置成为全局变量, 这里就涉及到了变量捕获的知识点了
多线程 -- Thread类的基本用法
变量只能访问, 常量或者未被修改的量

上述线程中断的方法是 自己创建了一个变量来控制循环
而Thread类内置了;一个标志位, 让我们更加方便的实现上述的效果, 如下

public class ThreadDemo10 {
    public static void main(String[] args) {
        Thread t = new Thread(() -> {
            // currentThread 是获取到当前线程的实例
            // 此处currentThread 得到的对象就是t
            // Thread.currentThread() 等价于 t
            // isInterrupted 就是 t 对象里自带的一个标志位
            while (!Thread.currentThread().isInterrupted()){
                System.out.println("hello t");
                try {
                    Thread.sleep(1000);

                } catch (InterruptedException e) {
                    e.printStackTrace();
                    break;
                }
            }
        });

        t.start();
        try {
            Thread.sleep(3000);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        // 把 t 内部的标志位给设置成true
        t.interrupt();
    }
}

多线程 -- Thread类的基本用法

多线程 -- Thread类的基本用法
多线程 -- Thread类的基本用法
在这里sleep可以有三种操作:

  1. 忽略中断条件继续执行
	try {
	    Thread.sleep(1000);
	
	} catch (InterruptedException e) {
//  	e.printStackTrace();
//  	break;
	}
  1. 立刻中断
	try {
	    Thread.sleep(1000);
	
	} catch (InterruptedException e) {
		e.printStackTrace();
		break;
	}
  1. 等待一会再中断
	try {
	    Thread.sleep(1000);
	
	} catch (InterruptedException e) {
	    e.printStackTrace();
	    try {
	        Thread.sleep(3000);
	    } catch (InterruptedException ex) {
	        e.printStackTrace();
	    }
	    break;
	}

多线程 -- Thread类的基本用法

  1. 线程等待
    因为线程之间是并发执行的, 操作系统对于线程的调度, 是无序的.
    所以无法判定, 两个线程谁先执行结束, 谁后执行结束
    多线程 -- Thread类的基本用法
    像是上述的不确定情况可能会出现bug
    所以可以使用线程等待来实现调度的顺序
    join方法
public class ThreadDemo11 {
    public static void main(String[] args) throws InterruptedException {
        Thread t = new Thread(() -> {
            System.out.println("hello t");
        });
        t.start();
        t.join();
        System.out.println("hello main");
    }
}

多线程 -- Thread类的基本用法

join()的两个版本
join 的无参数版本, 效果是"死等"(不见不散)
join 的有参数版本, 则是指定最大时间, 如果等待的时间到了上限, 还没等到, 也就不等了

让main方法等待t线程结束, 再执行(简单来说就是.join的先执行)

线程的六种状态

操作系统里的线程, 自身是有一个状态的
但是Java Thread是对系统线程的封装, 把这里的状态又进一步的精细化了
多线程 -- Thread类的基本用法

NEW 状态

在启动之前, 获取线程状态就是 NEW

public class ThreadDemo12 {
    public static void main(String[] args) {
        Thread t = new Thread(() -> {
            System.out.println("hello t");
        });
        // 在启动之前, 获取线程状态, NEW
        System.out.println(t.getState());
        t.start();
    }
}

TERMNATED 状态

线程已经执行完了, Thread对象还在就是, TERMNATED状态

public class ThreadDemo12 {
    public static void main(String[] args) throws InterruptedException {
        Thread t = new Thread(() -> {
            System.out.println("hello t");
        });
        // 在启动之前, 获取线程状态, NEW
//        System.out.println(t.getState());
        t.start();
        Thread.sleep(2000);
        System.out.println(t.getState());
    }
}

RUNNABLE 就绪状态

程序还在运行就是, RUNNABLE 就绪状态

有两种情况

  1. 正在CPU上运行
  2. 准备好随时可以去CPU上运行
public class ThreadDemo12 {
    public static void main(String[] args) throws InterruptedException {
        Thread t = new Thread(() -> {
            while (true) {
                // 为了防止 hello t 把线程状态冲没了, 先把它注释掉
//            System.out.println("hello t");
            }
        });
        // 在启动之前, 获取线程状态, NEW
//        System.out.println(t.getState());
        t.start();
        Thread.sleep(2000);
        System.out.println(t.getState());
    }
}

TIMED_WAITING 状态

指定时间等待. sleep方法

public class ThreadDemo12 {
    public static void main(String[] args) throws InterruptedException {
        Thread t = new Thread(() -> {
            while (true) {
                // 为了防止 hello t 把线程状态冲没了, 先把它注释掉
//            System.out.println("hello t");
                try {
                    Thread.sleep(1000);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
        });
        // 在启动之前, 获取线程状态, NEW
//        System.out.println(t.getState());
        t.start();
        Thread.sleep(2000);
        System.out.println(t.getState());
    }
}

BLOCKED 状态

WAITING 状态

多线程 -- Thread类的基本用法

理解线程状态, 意义就是让我们能够更好的进行多线程代码的调试文章来源地址https://www.toymoban.com/news/detail-466814.html

  1. 线程休眠
  2. 获取线程实例

到了这里,关于多线程 -- Thread类的基本用法的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Thread 类基本用法详解

    Thread 是Java操作多线程 最核心 的类。 Java中创建线程的方法有很多种!!! 上述方法,只是语法规则不同,本质上是一样的方式,创造出的线程并无不同。 面试题一:请说明Thread类中run和start的区别 答案: 作用功能不同: a.run方法的作用是描述线程具体要执行的任务; b.

    2024年02月08日
    浏览(36)
  • String 类的基本用法及String 类的常见操作

    作者:月亮嚼成星~ 博客主页:月亮嚼成星~的博客主页 专栏:Java SE基础 工欲善其事必先利其器,给大家介绍一款超牛的斩获大厂offer利器——牛客网 点击免费注册和我一起刷题吧 总结: 构造字符串的三种方式: 1)使用常量串 2)直接使用new String对象 3)利用字符数组 St

    2024年02月02日
    浏览(33)
  • 【Linux】 由“进程”过渡到“线程” -- 什么是线程(thread)?

    如何看待地址空间和页表: 地址空间是进程能看到的资源窗口 页表决定,进程真正拥有资源的情况(页表映射多少才是拥有多少) 合理的对地址空间+页表进行资源划分,我们就可以对一个进程所有的资源进行分类 虚拟地址如何找到物理地址: 最后一级页表存放的是页框的起

    2024年02月15日
    浏览(33)
  • 深入理解高并发编程 - 深度解析Thread 类的源码

    先看源码:Thread 类实现了 Runnable 接口 而 Runnable 被@FunctionalInterface 注解标记为函数式接口,Runnable 接口源代码 再来看看@FunctionalInterface 注解的源码 FunctionalInterface 用于标记类或接口是否是一个函数式接口,并在运行时可用于反射获取信息。 这段代码是 Thread 类的一个静态初

    2024年02月09日
    浏览(38)
  • 【webrtc】rtc::Thread和std::thread 的用法

    itsfolf/Discord-Screenshare-Linux

    2024年02月16日
    浏览(30)
  • 【Android】多线程编程、异步消息处理机制以及new Handler()被标记为过时的解决办法,解决Handler内存泄漏问题和AsyncTask的基本用法

    1.1 弱引用 WeakReference (弱引用)是一种在Java中用于管理对象的引用的特殊引用类型。它的作用是在垃圾回收过程中,允许对象在没有强引用指向它时被回收( 当一个对象只有弱引用指向它,而没有强引用指向它时,垃圾回收器可能会在下一次垃圾回收时回收该对象,即使系

    2024年02月04日
    浏览(35)
  • java多线程之线程安全(重点,难点)

    由于操作系统中,线程的调度是抢占式执行的,或者说是随机的,这就造成线程调度执行时,线程的执行顺序是不确定的,虽然有一些代码在这种执行顺序不同的情况下也不会运行出错,但是还有一部分代码会因为执行顺序发生改变而受到影响,这就会造成程序出现Bug,对于多线程并发

    2024年01月25日
    浏览(34)
  • Scala概述及变量和常量的重点

    Scala是一种多范式的编程语言(多范式:多种编程方法的意思。有面向过程、面向对象、泛型、函数式四种程序设计方法),其设计的初衷是要集成面向对象编程和函数式编程的各种特性。Scala运行于Java平台(Java虚拟机),并兼容现有的Java程序 官网:https://www.scala-lang.org/

    2024年02月09日
    浏览(45)
  • JavaEE之多线程编程:4. 线程安全(重点!!!)

    下面我们来举个例子: 我们大家都知道,在单线程中,以下的代码100%是正确的。 但是,两个线程,并发的进行上述循环,此时逻辑可能就出现问题了。 上述这样的情况就是非常典型的线程安全问题。这种情况就是bug!! 只要实际结果和预期的结果不符合,就一定是bug。 想

    2024年01月25日
    浏览(33)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包