`
greemranqq
  • 浏览: 975807 次
  • 性别: Icon_minigender_1
  • 来自: 重庆
社区版块
存档分类
最新评论

多线程-常用方法(二)

阅读更多

线程大家都会创建,这里介绍一些常用的方法。

 

休眠(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 同步,等待该线程终止,里面可以使用参数,即等待该线程的时间。

分享到:
评论

相关推荐

    Java多线程-Thread类的常用结构及线程优先级

    理解并熟练掌握Thread类的构造器和方法,以及线程优先级的概念,对于编写高效、稳定的多线程程序至关重要。在实际开发中,应避免使用已过时的方法,合理利用线程调度机制,确保线程安全,提高程序性能。同时,对守护...

    java多线程同步问题

    多线程注意:wait()方法的调用要有判定条件常用 while () obj.wait(timeout, nanos); ... // Perform action appropriate to condition } synchronized会影响共享数据,但对其他语句的执行不会有规律了!

    Java多线程-多线程知识点总结和企业真题

    ### Java多线程知识点总结及企业真题解析 #### 一、知识点总结 ##### (1)多线程相关概念 1. **程序、进程和线程的区分**: - **程序**:为了完成特定的任务而编写的指令集合。它是静态的概念。 - **进程**:...

    429.427.JAVA基础教程_多线程-复习:线程的创建与常用方法(429).rar

    本教程聚焦于Java多线程的创建与常用方法,帮助开发者深入理解这一关键概念。 在Java中,线程的创建主要有两种方式:继承Thread类和实现Runnable接口。继承Thread类是最直接的方式,只需要重写run()方法,然后创建...

    412.410.JAVA基础教程_IDEA的使用与多线程-IDEA的常用设置(412).rar

    本教程主要围绕"412.410.JAVA基础教程_IDEA的使用与多线程-IDEA的常用设置(412)"展开,旨在帮助初学者掌握IDEA的基础操作以及如何在IDEA中进行多线程编程。 1. IDEA的基本设置 - 主题与界面定制:IDEA允许用户...

    彻底明白Java的多线程-线程间的通信.doc

    Java的多线程是编程中的一个关键概念,特别是在并发处理和高性能应用中。本文将深入讲解如何在Java中实现多线程以及线程间的通信。 首先,我们要理解一个虚假的多线程示例。在例1中,创建了两个`TestThread`对象,...

    Qt小工具源码-绘图-串口-播放wav-U盘热插拔-Sqlite数据库-扫描SD卡目录-中文字库-定时器-信号槽-多线程-QT常用控件

    本工程为自写的QT测试程序,已实现以下功能: 1.界面绘图,可修改画笔颜色、线宽等。 2.串口数据收、发(开发板上需更改...10.多线程的使用。 11.QT常用控件的使用。 该工程已通过测试,可在Ubuntu及开发板上运行。

    VC多线程编程的常用三种方法

    本篇文章将详细阐述VC++中实现多线程的三种常见方法:使用`CreateThread`函数、`_beginthread`/`_beginthreadex`函数以及基于`std::thread`的C++11标准库方法。 1. **使用CreateThread函数** Windows API提供的`...

    多线程实例-摇奖机源码

    此外,`ThreadPool`和`Task`并行库也是C#中实现多线程的常用方式。`ThreadPool`是一个线程池,它可以更有效地管理线程,减少创建和销毁线程的开销。`Task`并行库则是.NET Framework 4.0及更高版本引入的,提供了更加...

    B09多线程-1ppt课件(全).ppt

    【多线程概念详解】 多线程是一种编程技术,它允许多个任务或操作在同一程序中并发执行。在计算机科学中,程序是一组静态的指令,而进程则是这些指令在执行过程中的实例。线程是进程内的执行单元,每个线程都有自己...

    python多线程-threading模块.docx

    ### Python多线程-threaning模块详解 #### 概述 Python中进行多线程编程时,`threading`模块是非常重要的工具之一。相比于较为基础的`thread`模块,`threading`模块提供了更为丰富的功能与灵活性。本文将详细介绍`...

    414.412.JAVA基础教程_IDEA的使用与多线程-模板的使用和设置(414).rar

    Java基础教程:IDEA的使用与多线程——模板的使用和设置 IDEA,全称为IntelliJ IDEA,是一款广泛使用的Java集成开发环境(Integrated Development Environment),以其强大的代码自动补全、重构功能以及对Java项目...

    Java多线程-同步机制解决线程安全问题方式一:同步代码块

    Java多线程编程中,线程安全问题是常见的挑战,特别是在并发环境下,多个线程可能会同时访问和修改同一份共享资源,导致数据不一致。为了解决这个问题,Java提供了同步机制,其中一种常用的方式就是同步代码块...

    计算机后端-Java-Java核心基础-第19章 IDEA的使用与多线程 16. 线程的常用方法.avi

    计算机后端-Java-Java核心基础-第19章 IDEA的使用与多线程 16. 线程的常用方法.avi

    多线程中常用函数

    在多线程编程中,有效地管理和同步线程是至关重要的。本示例中,我们将讨论几个关键的多线程函数,以及如何在实际程序中应用它们。这些函数包括`pthread_create`、`pthread_mutex_lock`、`pthread_mutex_unlock`、`...

    并发服务器-多线程服务器详解

    ### 并发服务器—多线程服务器详解 #### 一、引言 在现代软件开发中,特别是网络应用和服务的设计中,对并发处理能力的需求日益增长。为了满足高并发访问的需求,开发人员常采用多线程技术来构建高效、响应迅速的...

    实验五-多线程(常用版).doc

    【实验五 - 多线程(常用版)】 在计算机编程中,多线程是一种并发执行任务的方法,它允许多个任务在同一时间片段内运行,从而提高了程序的效率和响应速度。Java 平台提供了对多线程的全面支持,本实验主要探讨如何...

    线程----BlockingQueue

    `BlockingQueue`是一种特殊类型的队列,主要用于多线程环境中的任务管理。它具有以下特性:当队列为空时,从队列中获取元素的操作会被阻塞;同样地,当队列满时,向队列中添加元素的操作也会被阻塞。这种特性使得`...

    C#_细说多线程(上下)

    ### C# 多线程详解 #### 一、线程的定义 1.1 **进程、应用程序域与线程的关系** - **进程**:在Windows系统中,进程是最基本的概念之一,代表一个运行中的程序实例。每个进程都有独立的地址空间和其他资源。进程...

    java多线程的讲解和实战

    Java多线程是Java编程中的重要概念,尤其在如今的多核处理器环境下,理解并熟练掌握多线程技术对于提高程序性能和响应速度至关重要。本资料详细讲解了Java多线程的原理,并提供了丰富的实战代码,非常适合Java初学者...

Global site tag (gtag.js) - Google Analytics