常用方法:

  • boolean isAlive() 测试此线程是否存活。
  • boolean isDaemon() 测试此线程是否为守护程序线程。
  • static void sleep?(long millis) 导致当前正在执行的线程休眠(暂时停止执行)指定的毫秒数,具体取决于系统计时器和调度程序的精度和准确性。
  • static void sleep?(long millis, int nanos) 导致当前正在执行的线程休眠(暂时停止执行)指定的毫秒数加上指定的纳秒数,具体取决于系统定时器和调度程序的精度和准确性。
  • void start() 导致此线程开始执行; Java虚拟机调用此线程的run方法。
  • Thread.State getState() 返回此线程的状态。
  • void join() 等待这个线程死亡。
  • void join?(long millis) 此线程最多等待 millis毫秒。
  • void join?(long millis, int nanos) 此线程最多等待 millis毫秒加上 nanos纳秒。
  • long getId() 返回此Thread的标识符。
  • String getName() 返回此线程的名称。
  • int getPriority() 返回此线程的优先级。
  • static void yield() 向调度程序提示当前线程是否愿意产生其当前使用的处理器

interrupt方法:

interrrpt方法只是做了一个标记,标记这个线程可以结束了,但是实际上要怎么结束,需要我们程序员自己处理。那我们怎么判断你是不是用interrrpt方法做了一个标记呢?用isInterrrpted方法来判断。
  • 想要停止run方法里面的所有代码,可以用return

yield方法的作用:

yield方法的作用是让当前正在运行的线程放弃CPU资源,让给其他线程使用。

/**
* @ClassName ThreadYileldExample
* @projectName: object1
* @author: Zhangmingda
* @description: XXX
* date: 2021/4/21.
*/
public class ThreadYileldExample {
public static void main(String[] args) {
Thread thread = new Thread(() -> {
int num = 0;
long beginTime = System.currentTimeMillis();
for(int i=0; i<1000000; i ++){
num++;
//Thread.yield();
}
long endTime = System.currentTimeMillis();
System.out.println("计算耗时:" + (endTime - beginTime) + "ms");
});
thread.start();
}
}

线程优先级应用setPriority

1,在操作系统中,线程是具有优先级的。系统会把CPU资源优先给优先级高的线程使用。
2,JAVA中优先级具有继承性,子类会默认继承父类的优先级。比如先线程A中启动了一个线程B那么线程B具有和A一样的优先级。
结果:在没有设置优先级的情况下,线程谁先运行完,他们的概率其实是一样的。但是调用了setPriprity方法之后,值更大的大概率会优先完成。
public class ThreadPriorityExample {
public static void main(String[] args) {
Runnable r = () -> {
for (int i=0; i<500; i++){
System.out.println("线程:" + Thread.currentThread().getName() + ",运行到" + i);
}
System.out.println("线程:" + Thread.currentThread().getName() + ",运行结束");
};
Thread threadA = new Thread(r,"A");
Thread threadB = new Thread(r,"B");
threadA.setPriority(8);
threadB.setPriority(2);
threadA.start();
threadB.start();
}
}

注意:
CPU会优先分配给线程优先级比较高的线程使用,但是,这并不表示优先级高的线程一定是先运行完成了之后才会运行优先级比较低的使用。线程优先级低的一样具有CPU的使用权限。所以我们可以发现我们设置线程优先级,只是告诉我们的JVM,优先级高的线程具有优先运行的趋势,但是这个并不表示他实际运行的时候就一定优先完成。
这个就好比,在我们学习中,有的同学是智商比较高,记忆力又非常好,有的同学可能要差一些。我们只能说智商比较高的同学经过学习之后,他考试的成绩应该比智商低一些同学好的概率要大一些。但是这并不表示他一定就会考得更好。我们智商差一些的同学经过自己的努力学习,加班加点之后,依然可以拿到更好的分数。

守护线程:setDaemon(true)

JAVA中有两种线程,一种是用户线程,一种收守护线程。
守护线程一种特殊的线程,他具有陪伴的意义。当系统中不存在用户线程了之后,守护线程也就随之会销毁。典型的守护线程就是JVM的垃圾回收,如果所有的用户线程都销毁了,那么也就没有任何东西可以被垃圾回收期回收了。这个时候垃圾回收器也会随之销毁。
子线程为守护线程示例:(子线程无下属的非守护线程,自动退出不会运行子线程代码
public class DaemonThreadTest {
public static void main(String[] args) {
Thread thread = new Thread() {
@Override
public void run() {
try {
Thread.sleep(2000);
} catch (InterruptedException e) {
e.printStackTrace();
}
//设置为守护线程之后,这个代码就不会运行
System.out.println("我是子线程,我运行完了");
}
};
//设置线程为守护线程
thread.setDaemon(true);
thread.start();
System.out.println("我是主线程我运行完了。");
}
}

daemon线程有子用户线程示例:(父级线程都会等待用户线程退出)

import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.PrintStream;
import java.util.Random; /**
* @ClassName ThreadDaemonExample
* @projectName: object1
* @author: Zhangmingda
* @description: XXX
* date: 2021/4/21.
*/
public class ThreadDaemonExample {
public static void main(String[] args) {
/**
* 设置为守护线程的子线程
*/
Runnable runnable = () -> { Thread subThread = new Thread(){
/**
* 子线程中的非守护孙子线程
*/
@Override
public void run() {
try {
Thread.sleep(2000);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("睡两秒的孙子线程结束了");
}
};
//孙子线程设置为用户线程
subThread.setDaemon(false);
subThread.start();
System.out.println("子线程运行...."); //子线程执行任务
String filePath = "多线程/src/daemonThreadOutput/subDaemonThreadOut.txt";
try {
System.setOut(new PrintStream(new FileOutputStream(filePath)));
} catch (FileNotFoundException e) {
e.printStackTrace();
}
System.out.println("我是子线程,我运行完了");
};
/** 孙子线程为用户线程,main线程为父线程,main线程也不会退出,
* filePath文件内成功写入:
* 我是子线程,我运行完了
* 睡两秒的孙子线程结束了
*/ Thread thread = new Thread(runnable,"子线程");
thread.setDaemon(true);
thread.start();
System.out.println(Thread.currentThread().getName() + "运行完了");
}
}

暂停和唤醒线程(已过时)

  • 1,suspend():暂停线程
  • 2,resume():恢复线程
/**
* @ClassName ThreadSuspendExample
* @projectName: object1
* @author: Zhangmingda
* @description: XXX
* date: 2021/4/21.
*/
public class ThreadSuspendExample {
public static void main(String[] args) throws InterruptedException {
Thread thread = new Thread() {
@Override
public void run() {
int num = 0;
while (true) {
System.out.println("num is " + (num ++));
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
};
thread.start();
System.out.println(Thread.currentThread().getName() + "开始睡眠5S");
Thread.sleep(3000);
System.out.println(Thread.currentThread().getName()+"睡眠结束,我要暂停子线程了...然后再睡5S");
thread.suspend();//暂停线程
Thread.sleep(3000);
System.out.println(Thread.currentThread().getName()+"睡眠结束,我要恢复子线程了...");
thread.resume();
}
}

API文档方法:

java 多线程:Thread类常用方法:setPriority优先级、interrupt中断标记、suspend暂停与唤醒resume(已过时);daemon守护线程的更多相关文章

  1. 探Java多线程Thread类和Runnable接口之间的联系

    首先复习一下Java多线程实现机制,Java实现多线程方法有如下这么几种: 1.继承了(extends)Thread类 2.实现了(implements)Runnable接口 也就是说  有如下两种情 ...

  2. Java多线程Thread类了解和使用

    创建线程的两种方式 extends Thread 类 public class WelComeApp { public static void main(String[] args) { Welcom ...

  3. [Java多线程]-Thread和Runable源码解析

    多线程:(百度百科借一波定义) 多线程(英语:multithreading),是指从软件或者硬件上实现多个线程并发执行的技术.具有多线程能力的计算机因有硬件支持而能够在同一时间执行多于一个线程,进而提 ...

  4. Java并发--Thread类详情

    以下是本文的目录大纲: 一.线程的状态 二.上下文切换 三.Thread类中的方法 转载原文链接:http://www.cnblogs.com/dolphin0520/p/3920357.html 一 ...

  5. java.lang.Thread类详解

    java.lang.Thread类详解 一.前言 位于java.lang包下的Thread类是非常重要的线程类,它实现了Runnable接口,今天我们来学习一下Thread类,在学习Thread类之前 ...

  6. Java多线程中的常用方法

    本文将带你讲诉Java多线程中的常用方法   Java多线程中的常用方法有如下几个 start,run,sleep,wait,notify,notifyAll,join,isAlive,current ...

  7. java多线程系列8-线程的优先级

    在java中设置线程优先级使用setPriority,在jdk中的源代码如下: public final void setPriority(int newPriority) { ThreadGroup ...

  8. Java多线程——ThreadLocal类的原理和使用

    Java多线程——ThreadLocal类的原理和使用 摘要:本文主要学习了ThreadLocal类的原理和使用. 概述 是什么 ThreadLocal可以用来维护一个变量,提供了一个ThreadLo ...

  9. java基础-Integer类常用方法介绍

    java基础-Integer类常用方法介绍 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 在实际程序使用中,程序界面上用户输入的数据都是以字符串类型进行存储的.而程序开发中,我们需 ...

随机推荐

  1. vue文件引入

    <template> <div class="hello"> <h1>{{ msg }}</h1> <!-- <h1&g ...

  2. CF187D BRT Contract

    考虑如果哪次经过了红灯则显然已经和出发的时间没关系了. 然后我们需要做的是怎么样找到最近的一个是红灯的点. 然后实际下是我们做一个前缀和:\(L_i = \sum d_i\) 然后求\(\min (L ...

  3. CF1562E Rescue Niwen!

    开始的时候只会一个\(O(n^2log)\) 即做出所有的\(n^2\)串,显然可以用\(SAM\)来进行这样一个排序,然后\(log\)做. 但这种题我们显然要找一些友好的性质: 我们发现字符串的比 ...

  4. sb 错误

    数组开小.很容易 \(2 \times 10^5\) 或 \(10^6\) 就开成 \(10^5\),或者各种变量的数据范围混用,\(m \leq 5\times 10^5\),结果只开到了 \(n\ ...

  5. 3D-DNA 挂载染色体

    3D-DNA是一款简单,方便的处理Hi-C软件,可将contig提升到染色体水平.其githup网址:https://github.com/theaidenlab/3d-dna 3D-DNA流程简介 ...

  6. python19 操作mysql

    connect 模块下载 https://dev.mysql.com/downloads/connector/python/ import mysql.connector con = mysql.co ...

  7. mongodb存储的基本使用

    Python连接mongodb一般使用pymongo模块 1. pymongo模块的简单使用 ### MongoDB存储 ## 连接MongoDB import pymongo # 建立连接对象,2种 ...

  8. 深度探讨 PHP 之性能

    1.缘起 关于PHP,很多人的直观感觉是PHP是一种灵活的脚本语言,库类丰富,使用简单,安全,非常适合WEB开发,但性能低下.PHP的性能是否真的就 如同大家的感觉一样的差呢?本文就是围绕这么一个话题 ...

  9. C++/Python冒泡排序与选择排序算法详解

    冒泡排序 冒泡排序算法又称交换排序算法,是从观察水中气泡变化构思而成,原理是从第一个元素开始比较相邻元素的大小,若大小顺序有误,则对调后再进行下一个元素的比较,就仿佛气泡逐渐从水底逐渐冒升到水面一样. ...

  10. 学习java 7.9

    学习内容: Date类 Date类常用方法 SimpleDateFormat 1.格式化(从Date到String) public final String format(Date date) 将日期 ...