Java多线程-线程的优先级(priority)以及守护线程(daemon)

简介: 笔记

前言


线程的优先级(priority) :是一个常量


Java提供一个线程调度器来监控程序中启动后进入就绪状态的所有线程,线程调度器按照优先级决定按照优先级决定应该调度哪个线程来执行


线程的优先级用数字表示,范围从1-10,线程优先级高给的资源会多一些, 线程优先级高并不一定先执行,但是权重就大了,比如1张彩票和10张彩票,中奖率就会提高

Thread.min_priority=1;
Thread.max_priority=10;
Thread.norm_priority=5;

10.png


获取优先级


使用以下方式改变或者获取优先级


getPriority().setPriority(int xxx )


注意


1 不可以将优先级设置负数或者大于10的数 只能1-10 不然会报错


2 要先设置优先级再启动


3 代码中如果哪行代码比较重要,我们就把它的优先级提升


4 优先级高并不是每次都会优先执行,只是权重大了些,更加容易先执行,具体要看cpu的调度


5 . 优先级低只是意味着调度的概率低,并不是优先级低就不会被调用了,同理,优先级低并不是每次都会优先执行,而是优先执行概率高,这都是看CPU的调度

package com.wyh.thread;
/**
 * @program: Thread
 * @description: 测试线程优先级
 * @author: 魏一鹤
 * @createDate: 2022-01-05 22:08
 **/
public class TestThreadPriority{
    public static void main(String[] args){
        //主线程默认优先级
        System.out.println(Thread.currentThread().getName()+"------------>"+Thread.currentThread().getPriority());
        MyThreadPriority myThreadPriority = new MyThreadPriority();
        Thread thread1 = new Thread(myThreadPriority);
        Thread thread2 = new Thread(myThreadPriority);
        Thread thread3 = new Thread(myThreadPriority);
        Thread thread4 = new Thread(myThreadPriority);
        Thread thread5 = new Thread(myThreadPriority);
        Thread thread6 = new Thread(myThreadPriority);
        Thread thread7 = new Thread(myThreadPriority);
        Thread thread8 = new Thread(myThreadPriority);
        //先设置优先级再启动
        ///t1直接启动
        thread1.start();
        //t2设置优先级为1再启动
        thread2.setPriority(1);
        thread2.start();
        //t3设置优先级为4再启动
        thread3.setPriority(4);
        thread3.start();
        //t3设置优先级为默认最高级(10)再启动  MAX_PRIORITY默认最高级10
        thread4.setPriority(Thread.MAX_PRIORITY);
        thread4.start();
        //t7设置优先级为默认最低级(1)再启动  MIN_PRIORITY最高级1
        thread7.setPriority(Thread.MIN_PRIORITY);
        thread7.start();
        //t8设置优先级为默认中级(5)再启动  NORM_PRIORITY默认最高级5
        thread8.setPriority(Thread.NORM_PRIORITY);
        thread8.start();
        //t5设置优先级为-1  优先级不能设置为负数 不然会报错
        thread5.setPriority(-1);
        thread5.start();
        //t6设置优先级为11  优先级不能超过10 不然会报错
        thread6.setPriority(11);
        thread6.start();
    }
}
class MyThreadPriority implements  Runnable {
    @Override
    public void run() {
        //Thread.currentThread().getPriority() 线程的优先级
        System.out.println(Thread.currentThread().getName()+"------------>"+Thread.currentThread().getPriority());
    }
}

守护线程(daemon)


有一个方法setDaemon(Boolean xxx),参数为布尔类型,为真守护,为假不守,默认为false,表示是用户线程,正常的线程都是用户线程,除非加了setDaemon(Boolean xxx)才是守护线程


线程分为用户线程和守护线程


虚拟机必须确保用户线程执行完毕(main就是一个用户线程)


虚拟机不用等待守护线程执行完毕(gc垃圾回收就是一个守护线程,后台记录操作日志,监控内存,垃圾回收等待都是守护线程的例子)


例子


package com.wyh.thread;
/**
 * @program: Thread
 * @description: 测试线程守护
 * @author: 魏一鹤
 * @createDate: 2022-01-06 22:03
 **/
//可以想象例子 上帝守护人类  在
// 这个例子中 上帝是永生的 人类是暂时的
// 上帝相当于守护线程,人类是一个用户线程,上帝守护者我们
public class TestThreadDaemon {
    public static void main(String[] args){
        //用户
        Person person = new Person();
        Thread threadPerson = new Thread(person);
        //守护
        God god = new God();
        Thread threadGod = new Thread(god);
        //设置守护  默认为false,表示是用户线程
        //正常的线程都是用户线程,除非加了setDaemon(Boolean xxx)才是守护线程
        threadGod.setDaemon(true);
        //上帝守护线程启动
        threadGod.start();
        //人类线程启动
        threadPerson.start();
    }
}
//上帝
class  God implements  Runnable {
    @Override
    public void run() {
        while (true) {
            System.out.println("上帝守护者人类");
        }
    }
}
//人类
class Person implements  Runnable{
    @Override
    public void run() {
        for (int i = 0; i < 365; i++) {
            System.out.println("人类开开心心的活着"+i+"天");
        }
        System.out.println("=======goodbye======");
    }
}
相关文章
|
4天前
|
安全 Java UED
Java中的多线程编程:从基础到实践
本文深入探讨了Java中的多线程编程,包括线程的创建、生命周期管理以及同步机制。通过实例展示了如何使用Thread类和Runnable接口来创建线程,讨论了线程安全问题及解决策略,如使用synchronized关键字和ReentrantLock类。文章还涵盖了线程间通信的方式,包括wait()、notify()和notifyAll()方法,以及如何避免死锁。此外,还介绍了高级并发工具如CountDownLatch和CyclicBarrier的使用方法。通过综合运用这些技术,可以有效提高多线程程序的性能和可靠性。
|
3天前
|
缓存 Java UED
Java中的多线程编程:从基础到实践
【10月更文挑战第13天】 Java作为一门跨平台的编程语言,其强大的多线程能力一直是其核心优势之一。本文将从最基础的概念讲起,逐步深入探讨Java多线程的实现方式及其应用场景,通过实例讲解帮助读者更好地理解和应用这一技术。
19 3
|
5天前
|
缓存 安全 Java
使用 Java 内存模型解决多线程中的数据竞争问题
【10月更文挑战第11天】在 Java 多线程编程中,数据竞争是一个常见问题。通过使用 `synchronized` 关键字、`volatile` 关键字、原子类、显式锁、避免共享可变数据、合理设计数据结构、遵循线程安全原则和使用线程池等方法,可以有效解决数据竞争问题,确保程序的正确性和稳定性。
13 2
|
7天前
|
存储 安全 Java
Java-如何保证线程安全?
【10月更文挑战第10天】
|
7天前
|
Java
|
2天前
|
缓存 算法 Java
|
7天前
|
Java 应用服务中间件 测试技术
Java21虚拟线程:我的锁去哪儿了?
【10月更文挑战第8天】
19 0
|
13天前
|
存储 消息中间件 资源调度
C++ 多线程之初识多线程
这篇文章介绍了C++多线程的基本概念,包括进程和线程的定义、并发的实现方式,以及如何在C++中创建和管理线程,包括使用`std::thread`库、线程的join和detach方法,并通过示例代码展示了如何创建和使用多线程。
31 1
C++ 多线程之初识多线程
|
28天前
|
数据采集 负载均衡 安全
LeetCode刷题 多线程编程九则 | 1188. 设计有限阻塞队列 1242. 多线程网页爬虫 1279. 红绿灯路口
本文提供了多个多线程编程问题的解决方案,包括设计有限阻塞队列、多线程网页爬虫、红绿灯路口等,每个问题都给出了至少一种实现方法,涵盖了互斥锁、条件变量、信号量等线程同步机制的使用。
LeetCode刷题 多线程编程九则 | 1188. 设计有限阻塞队列 1242. 多线程网页爬虫 1279. 红绿灯路口
|
13天前
|
存储 前端开发 C++
C++ 多线程之带返回值的线程处理函数
这篇文章介绍了在C++中使用`async`函数、`packaged_task`和`promise`三种方法来创建带返回值的线程处理函数。
36 6