Thread线程类

设置线程名

查看线程名是很简单的,调用Thread.currentThread().getName()即可。

public class MyThreadDemo {
    public static void main(String[] args) {

        MyThread myThread = new MyThread();

        //带参构造方法给线程起名字
        Thread thread1 = new Thread(myThread, "关注公众号Java3y");
        Thread thread2 = new Thread(myThread, "qq群:742919422");

        thread1.start();
        thread2.start();

        // 打印当前线程的名字
        System.out.println(Thread.currentThread().getName());
    }
}

守护线程

守护线程是为其他线程服务的

  • 垃圾回收线程就是守护线程~

守护线程有一个特点

  • 当别的用户线程执行完了,虚拟机就会退出,守护线程也就会被停止掉了。
  • 也就是说:守护线程作为一个服务线程,没有服务对象就没有必要继续运行

使用线程的时候要注意的地方

  1. 在线程启动前设置为守护线程,方法是setDaemon(boolean on)
  2. 使用守护线程不要访问共享资源(数据库、文件等),因为它可能会在任何时候就挂掉了。
  3. 守护线程中产生的新线程也是守护线程

优先级线程

线程优先级高仅仅表示线程获取的CPU时间片的几率高,但这不是一个确定的因素

线程的优先级是高度依赖于操作系统的,Windows和Linux就有所区别(Linux下优先级可能就被忽略了)~

可以看到的是,Java提供的优先级默认是5,最低是1,最高是10:

线程生命周期

线程有3个基本状态:执行、就绪、阻塞

Thread上很多的方法都是用来切换线程的状态的,

sleep方法(thread类中的静态方法,Thread.sleep()调用后,所在的线程进入等待)

调用sleep方法会进入计时等待状态,等时间到了,进入的是就绪状态而并非是运行状态!(注意sleep方法不会释放锁)

yield方法(thread类中的静态方法,调用后所在当前线程让出cpu的控制权)

调用yield方法会先让别的线程执行,但是不确保真正让出

意思是:我有空,可以的话,让你们先执行

join方法(是final方法,线程1对象.final(),则线程1具有优先性,它先执行完,才执行别的线程)

调用join方法,会等待该线程执行完毕后才执行别的线程~

interrupt方法

线程中断在之前的版本有stop方法,但是被设置过时了。现在已经没有强制线程终止的方法了!

由于stop方法可以让一个线程A终止掉另一个线程B

  • 被终止的线程B会立即释放锁,这可能会让对象处于不一致的状态
  • 线程A也不知道线程B什么时候能够被终止掉,万一线程B还处理运行计算阶段,线程A调用stop方法将线程B终止,那就很无辜了~

总而言之,Stop方法太暴力了,不安全,所以被设置过时了。

我们一般使用的是interrupt来请求终止线程~

  • 要注意的是:interrupt不会真正停止一个线程,它仅仅是给这个线程发了一个信号告诉它,它应该要结束了(明白这一点非常重要!)
  • 也就是说:Java设计者实际上是想线程自己来终止,通过上面的信号,就可以判断处理什么业务了。
  • 具体到底中断还是继续运行,应该由被通知的线程自己处理
  • Thread t1 = new Thread( new Runnable(){
        public void run(){
            // 若未发生中断,就正常执行任务
            while(!Thread.currentThread.isInterrupted()){
                // 正常任务代码……
            }
            // 中断的处理代码……
            doSomething();
        }
    } ).start();
    

    再次说明:调用interrupt()并不是要真正终止掉当前线程,仅仅是设置了一个中断标志。这个中断标志可以给我们用来判断什么时候该干什么活!什么时候中断由我们自己来决定,这样就可以安全地终止线程了!

  • interrupt线程中断还有另外两个方法(检查该线程是否被中断):[检查中断是使用interrupt的用途之一]
    • 静态方法interrupted()-->会清除中断标志位
    • 实例方法isInterrupted()-->不会清除中断标志位
    • 【用途二:用在阻塞线程,或者将要进入阻塞的线程,设置中断状态(即使用interrupt())时,抛出interruptException,中断状态复位,同时该线程会退出阻塞的】

原文地址:https://www.cnblogs.com/serendipity-fly/p/9359043.html

时间: 2024-10-16 19:35:56

Thread线程类的相关文章

Thread线程类使用随笔

Thread步骤 实例化Thread类,并传入一个指向线程所要运行方法的委托.(这时候这个线程已经产生,但是还没有运行) 调用Thread实例的Start方法,标记该线程可以被CPU执行了,但具体执行时间由CPU决定. 前台线程和后台线程区别 前台线程:只有所有的前台线程都关闭才能完成程序关闭. 后台线程:只要所有的前台线程结束,后台线程自动结束. Thread常用方法 Start()启动线程(告诉CPU 我可以被执行了,具体什么时候执行,由CPU决定) Abort()终止线程 终止完成之后不能

C#的线程类之Thread类以及对为什么设置线程优先级却不先执行这一问题本身的认识

1.C#对线程进行操作时,通过Thread类,可以对线程进行创建.挂起.恢复.休眠.终止及设置优先级. Thread类位于System.Threading命名空间下,该命名空间还包含一个ThreadPool类(允许用户使用系统提供的线程池)和一个Timer类(在线程池上执行回调方法) 在线程运行期间,不同的时刻会表现为不同的状态,但它总是处于由ThreadState定义的一个或多个状态中.用户可以通过使用ThreadPriority枚举为线程定义优先级,但不能保证操系统会接收该优先级 2.Thr

Java带参数的线程类ParameterizedThread——即如何给Thread传递参数

在Java中似乎没有提供带运行参数的线程实现类,在第三方类库中也没有找到.网上有大量的文章在讨论这个问题,但都没有提供很好的代码封装解决方案,这令我很吃惊.如果读者知道有官方或者第三方的实现方式,欢迎留言说明.本文最后给出了一种实现带运行参数的线程实现类. 在C#的基础类库中早就提供了相关的解决方案,如下是C#提供的带参数的子线程创建方法: Thread th = new Thread((param) => { Console.WriteLine(param); }); th.Start(i);

Delphi线程类 DIY(把类指针作为参数传进去,就可以执行类里面的方法啦)

Delphi 封装了一个很强大的线程类 TThread, 我们也自己动手制作一个简单的线程类 首先Type一个类 [delphi] view plain copy type TwwThread = class constructor Create; overload; destructor Destroy; override; private m_hThread: THandle;     //线程 m_ThreadID : TThreadID; public procedure Execute

一种线程类的实现方法

写一个线程基类,用户通过继承该基类,重写基类中定义的线程运行函数,即可实现启动线程运行自己的函数. 1 //Thread.h 2 3 #ifndef _THREAD_H 4 #define _THREAD_H 5 6 #include <pthread.h> 7 8 class Thread 9 { 10 public: 11 Thread(); 12 virtual ~Thread(); 13 void Start(); 14 void SetAutoDelete(bool autoDele

QT线程(一):线程类

线程之间共享数据,但又单独执行: QT线程QThread是平台无关的: 通常主线程从main开始执行,而在主线程中创建其他线程,其他线程派生于QThread: 1.线程优先级 总共8个优先级:线程优先级从上到下越来越高. Constant Value Description QThread::IdlePriority 0 scheduled only when no other threads are running. QThread::LowestPriority 1 scheduled le

[Java聊天室服务器]实战之四 线程类

前言 学习任何一个稍有难度的技术,要对其有充分理性的分析,之后果断做出决定---->也就是人们常说的"多谋善断":本系列虽然涉及的是socket相关的知识,但学习之前,更想和广大程序员分享的是一种心境:学习是一个循序渐进的过程,心态应该随时调节,保持戒骄戒躁的状态.比如最近在看网易公开课MIT<算法导论>,老师提到,学习算法之前要计算机数学+离散数学+概率论等课程的知识,所以一直学不好算法的程序员不妨从基础入手,这都是中国式教育惹的祸啊!(此处省略一万字......)

Process进程 ; Thread线程

<> 前台线程和后台线程 InvokeHelper:跨线程访问/修改主界面控件方法.属性 C#线程用法及跨线程访问 using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Diagnostics; namespace 进程Process { /// <summary> /// Process类是一个非静态类.它里面包含静态成员和非静态成员.静

Delphi 实现多线程编程的线程类 TThread

http://blog.csdn.net/henreash/article/details/3183119 Delphi中有一个线程类TThread是用来实现多线程编程的,这个绝大多数Delphi书藉都有说到, 但基本上都是对TThread类的几个成员作一简单介绍,再说明一下Execute的实现和Synchronize的用法就完了. 然而这并不是多线程编程的全部,我写此文的目的在于对此作一个补充. 线程本质上是进程中一段并发运行的代码. 一个进程至少有一个线程,即所谓的主线程. 同时还可以有多个