线程大家都会创建,这里介绍一些常用的方法。
休眠(sleep):
就和睡觉一样,假设工作是一个任务,你需要休息,因此你可以什么都不做,休息你指定的时间,接着工作。
public class MyWork implements Runnable { static int num = 24; @Override public void run() { while(num > 0){ System.out.println("在工作.."); num --; // 工作累了 休息 try { // 线程内置方法, 默认是以毫秒为单位 Thread.sleep(1000); // 这是对时间颗粒度更加精确的一个类,只是处理了时间,实际还 // 是会调用Thread.sleep, // 具体请看源码 和 API //TimeUnit.SECONDS.sleep(1); } catch (InterruptedException e) { e.printStackTrace(); } } } public static void main(String[] args) { ExecutorService ex = Executors.newFixedThreadPool(1); ex.execute(new MyWork()); ex.shutdown(); } }
Thread.yield():
这是native 方法,当有多个线程的时候,A线程 调用了这个方法,会立即放弃当前线程,让另外的B线程先执行。
Thread.interrupted():
线程打断,就是当你在睡觉途中,也可以将你喊醒。这会出现异常,唤醒之后继续执行。
public static void main(String[] args) { MyWork m = new MyWork(); Thread t = new Thread(m); t.start(); t.interrupt(); }
wait():线程等待,也是让你去休息。可以加入时间。可以通过notify() 唤醒。
区别:sleep 会占用CPU,不让别人用。相当于你在办公室睡觉,办公室就不能让别人用的,醒了之后依然是你用着的。wait 不会占CPU,让你到睡觉区域(线程池)。办公室就空闲出来。如果时间到了,或者被唤醒,你们又要从新争夺谁 先使用办公室,这是线程调度控制。
有些时间,我们需要让线程优先执行,理论上我们最好不要干预调度器,因为时间片很短,无法察觉,但是还是可以干扰的。
public static void main(String[] args) { // 工作线程 MyWork m = new MyWork(); // 玩的线程 Play a = new Play(); Thread t = new Thread(m); Thread t1 = new Thread(a); t1.start(); t1.setPriority(10); t.start(); t.setPriority(2); }
setPriority :设置线程优先级别,JAVA 默认是5,有1-10个级别。超出了就异常了。这里的优先级不是绝对的。比如 优先级 1 跟 2 之间 ,2的优先级虽然大于1,只能保证大多数2的线程先执行,并不是全部。如果像t1 线程设置成10.优先级就比2 高太多。很大程度上能保证t1 全部执行。影响只是相对的。
后台进程(daemon):也叫守护线程。是指程序运行的时候后台提供的一种通用服务的线程,这种线程不属于程序中不可缺少的部分。当非后台线程结束时,程序结束,并且杀死后台进程。相当于一个主从关系,主要的结束了,其他的就结束了。main 就是非后台进程。
(守护线程作用)setDaemon: 是true,才设置成守护线程,这个很好理解,也是一个线程,不过有个依赖关系。举个例子:比如我工作累,在休息。但是又怕睡久了,老板找我麻烦。因此我可以让我父母再我睡了30分钟后,通知我起床。 我相当于 主线程,父母就是守护线程。如果我已经被叫醒了,或者我自动醒了, 那么他们 就不用再叫我,也就结束了。下面看代码:
public class ParentDaemon implements Runnable { static int num = 10; @Override public void run() { while(num > 0){ if(num != 1){ System.out.println("等待中..."+num); }else{ System.out.println("小强,快起床了..."); } num --; try { Thread.sleep(1000); } catch (InterruptedException e) { e.printStackTrace(); } } } public static void main(String[] args) { ParentDaemon p = new ParentDaemon(); Thread t = new Thread(p); t.setDaemon(true); t.start(); try { // 主线程main() (我) 在休息。 // 这里可以将时间 延迟到 10000,设置我自动醒,和被叫醒两种模式。 // 如果是10,我自动醒,那么 守护线程就结束了,否者一直执行。 t.sleep(10); } catch (InterruptedException e) { e.printStackTrace(); } } }
isDaemon : 判断当前线程是否是守护线程。
Thread.join:表示A 线程调用了此方法,A 就会先执行 完毕。当然 也可以interrupt 打断。
public class Play implements Runnable { static int num = 24; @Override public void run() { while(num > 0){ System.out.println("在玩.."); num --; } } public static void main(String[] args) { Play pl = new Play(); Thread t = new Thread(pl); t.start(); // 可以尝试不用 join ,看看效果 try { t.join(); } catch (InterruptedException e) { e.printStackTrace(); } System.out.println("这是主线程,由于用了join 方法,因此t 线程比我(main )先执行完毕"); } }
join 其实使用了synchronized 同步,等待该线程终止,里面可以使用参数,即等待该线程的时间。
相关推荐
理解并熟练掌握Thread类的构造器和方法,以及线程优先级的概念,对于编写高效、稳定的多线程程序至关重要。在实际开发中,应避免使用已过时的方法,合理利用线程调度机制,确保线程安全,提高程序性能。同时,对守护...
多线程注意:wait()方法的调用要有判定条件常用 while () obj.wait(timeout, nanos); ... // Perform action appropriate to condition } synchronized会影响共享数据,但对其他语句的执行不会有规律了!
### Java多线程知识点总结及企业真题解析 #### 一、知识点总结 ##### (1)多线程相关概念 1. **程序、进程和线程的区分**: - **程序**:为了完成特定的任务而编写的指令集合。它是静态的概念。 - **进程**:...
本教程聚焦于Java多线程的创建与常用方法,帮助开发者深入理解这一关键概念。 在Java中,线程的创建主要有两种方式:继承Thread类和实现Runnable接口。继承Thread类是最直接的方式,只需要重写run()方法,然后创建...
本教程主要围绕"412.410.JAVA基础教程_IDEA的使用与多线程-IDEA的常用设置(412)"展开,旨在帮助初学者掌握IDEA的基础操作以及如何在IDEA中进行多线程编程。 1. IDEA的基本设置 - 主题与界面定制:IDEA允许用户...
Java的多线程是编程中的一个关键概念,特别是在并发处理和高性能应用中。本文将深入讲解如何在Java中实现多线程以及线程间的通信。 首先,我们要理解一个虚假的多线程示例。在例1中,创建了两个`TestThread`对象,...
本工程为自写的QT测试程序,已实现以下功能: 1.界面绘图,可修改画笔颜色、线宽等。 2.串口数据收、发(开发板上需更改...10.多线程的使用。 11.QT常用控件的使用。 该工程已通过测试,可在Ubuntu及开发板上运行。
本篇文章将详细阐述VC++中实现多线程的三种常见方法:使用`CreateThread`函数、`_beginthread`/`_beginthreadex`函数以及基于`std::thread`的C++11标准库方法。 1. **使用CreateThread函数** Windows API提供的`...
此外,`ThreadPool`和`Task`并行库也是C#中实现多线程的常用方式。`ThreadPool`是一个线程池,它可以更有效地管理线程,减少创建和销毁线程的开销。`Task`并行库则是.NET Framework 4.0及更高版本引入的,提供了更加...
【多线程概念详解】 多线程是一种编程技术,它允许多个任务或操作在同一程序中并发执行。在计算机科学中,程序是一组静态的指令,而进程则是这些指令在执行过程中的实例。线程是进程内的执行单元,每个线程都有自己...
### Python多线程-threaning模块详解 #### 概述 Python中进行多线程编程时,`threading`模块是非常重要的工具之一。相比于较为基础的`thread`模块,`threading`模块提供了更为丰富的功能与灵活性。本文将详细介绍`...
Java基础教程:IDEA的使用与多线程——模板的使用和设置 IDEA,全称为IntelliJ IDEA,是一款广泛使用的Java集成开发环境(Integrated Development Environment),以其强大的代码自动补全、重构功能以及对Java项目...
Java多线程编程中,线程安全问题是常见的挑战,特别是在并发环境下,多个线程可能会同时访问和修改同一份共享资源,导致数据不一致。为了解决这个问题,Java提供了同步机制,其中一种常用的方式就是同步代码块...
计算机后端-Java-Java核心基础-第19章 IDEA的使用与多线程 16. 线程的常用方法.avi
在多线程编程中,有效地管理和同步线程是至关重要的。本示例中,我们将讨论几个关键的多线程函数,以及如何在实际程序中应用它们。这些函数包括`pthread_create`、`pthread_mutex_lock`、`pthread_mutex_unlock`、`...
### 并发服务器—多线程服务器详解 #### 一、引言 在现代软件开发中,特别是网络应用和服务的设计中,对并发处理能力的需求日益增长。为了满足高并发访问的需求,开发人员常采用多线程技术来构建高效、响应迅速的...
【实验五 - 多线程(常用版)】 在计算机编程中,多线程是一种并发执行任务的方法,它允许多个任务在同一时间片段内运行,从而提高了程序的效率和响应速度。Java 平台提供了对多线程的全面支持,本实验主要探讨如何...
`BlockingQueue`是一种特殊类型的队列,主要用于多线程环境中的任务管理。它具有以下特性:当队列为空时,从队列中获取元素的操作会被阻塞;同样地,当队列满时,向队列中添加元素的操作也会被阻塞。这种特性使得`...
### C# 多线程详解 #### 一、线程的定义 1.1 **进程、应用程序域与线程的关系** - **进程**:在Windows系统中,进程是最基本的概念之一,代表一个运行中的程序实例。每个进程都有独立的地址空间和其他资源。进程...
Java多线程是Java编程中的重要概念,尤其在如今的多核处理器环境下,理解并熟练掌握多线程技术对于提高程序性能和响应速度至关重要。本资料详细讲解了Java多线程的原理,并提供了丰富的实战代码,非常适合Java初学者...