线程(线程中常用方法)

JAVA程序设计----多线程(上) 昨天外出了,没有更,老样子,思考小结。 1.Java为什么要引入线程机制,线程、程序、进程之间的关系是怎样的? 线程可以彼此独立的执行,它是一种实现并发机制的有效手段,可以同时使用多个线程来完成不同的任务,并且一般用户在使用多线程时并不考虑底层处理的细节。 进程(process)是程序的一次执行过程,或是正在运行的一个程序。线程是比进程更小的程序执行单位,一个进程可以启动... 阅读详情

1.进程:系统进行资源分配调用的独立单元叫进程.每个进程都有自己独立内存空间和系统资源.(正在运行的程序)

cpu时间片:指的是系统资源和内存空间.

2.线程:进程中的一条执行线路.每个线程要执行一个任务.进程中所有线程共享当前这个进程中系统资源和内存空间.

同一个进程中多个线程之间是互抢资源竟争关系.

3.进程与线程的关系:一个进程中可以一个到多个线程;一个线程只属于一个进程.

4.实现线程:有三种实现方式,前两种公司常用,第三种基本不用.

4.1:继承Thread类,来实现线程

eg:public class MyThead extends Thread{
	/**
	 * 重写父类中线程的任务方法
	 */
	@Override
	public void run() {
		for (int i = 1; i <=10; i++) {
			System.out.println(this.name+":"+i);
		}
	}
}
public static void main(String[] args) {
		//创建子线程对象
		MyThead t1=new MyThead();
		MyThead t2=new MyThead();
				
		//启动线程
		t1.start();
		t2.start();
	}

4.2:实现Runnable接口,实现线程.

eg:public class MyRunable implements Runnable{
	/**
	 * 实现父接口中任务方法
	 */
	@Override
	public void run() {
		for (int i = 1; i <=10; i++) {
			System.out.println(Thread.currentThread().getName()+":"+i);
		}
	}
} 

public static void main(String[] args) {
		//创建任务对象
		MyRunable r1=new MyRunable();
		MyRunable r2=new MyRunable();
		//用任务构建线程对象
		Thread t1=new Thread(r1, "线程A");
		Thread t2=new Thread(r2, "线程B");
		//启动线程
		t1.start();
		t2.start();
	}

4.3:实现Callable接口,实现线程(现在基本不用).

5.继承Thread VS 实现Runnable接口的方式实现多线程

5.1:代码简洁性不同:继承Thread的方式实现线程,代码较简洁;实现Runnable接口的方式实现线程,代码较复杂.

5.2:扩展性不同:继承Thread的方式实现线程,不能再继承其他类,只能实现其他接口,所以扩展性较差;实现Runnable接口的方式实现线程,还可以再继承其他类实现其他接口,所以扩展性好.

5.3:资源共享性:继承Thread的方式实现线程,如果想让多个线程执行同一个任务,只能用静态的,静态比较耗资源,共享性不好;实现Runnable接口的方式实现线程,如果想让多个线程执行同一个任务,只需要让这多个线程共用同一个任务对象就可,共享较好.

6.给线程取名:

6.1:用线程对象调用setName("线程名");

6.2:用构造方法给线程取名.

6.3:用属性方式给线程取名.

6.4:用线程默认名称.

7.线程休眠:使当前正在执行的线程以指定的毫秒数暂停执行或暂停资源抢夺,等待时间到了后再重新参加资源抢夺.

语法:Thread.sleep(毫秒); 或 线程对象.sleep(毫秒);

eg:public static void main(String[] args) throws InterruptedException {
		for (int i = 6; i >=1; i--) {
			System.out.println(Thread.currentThread().getName()+":"+i);
			//每输出一个数字就让当前线程休眠一秒钟
			Thread.sleep(1000);
		}
   }

8.线程优先级:线程优先级由1-10,数字越大优先级越高.优先级越高的线程抢占资源的概率越高,但并不一定就能抢得到;优先级越低的线程抢占资源的概率越低,但并不一定抢不到.

注意:一定要在线程启动之前设置线程优先级.

语法:线程对象.setPriority(int newPriority)

eg:public static void main(String[] args) {
		//创建线程对象
		MyThead t1=new MyThead();
		MyThead t2=new MyThead();

		//设置线程优先级
		t1.setPriority(Thread.MIN_PRIORITY);
		t2.setPriority(Thread.MAX_PRIORITY);
		
		//启动线程
		t1.start();
		t2.start();
}

9.线程合并:将两个及两个以上的线程合并为一个线程,合并过来的线程先执行完,再执行原来线程.

语法:线程对象.join()

9.1:子线程合并到主线中:合并之前,子线程和主线程互抢资源,当前子线程合并过来后就变成一条执行线路,子线程要先执行完再执行主线程后面的内容.

eg:public class MyThead extends Thread{
	/**
	 * 重写父类中线程的任务方法
	 */
	@Override
	public void run() {
		for (int i = 1; i <=100; i++) {
			System.out.println(Thread.currentThread().getName()+":"+i);
		}
	}
}

public static void main(String[] args) throws InterruptedException {
		//创建一个子线程
		MyThead t1=new MyThead();
		//设置线程名称
		t1.setName("子线程");
		
		//启动子线程
		t1.start();
		
		for (int i = 1; i <=100; i++) {
			System.out.println(Thread.currentThread().getName()+":"+i);
			//当主线程运行到10时,子线程合并过来,子线程先执行完再执行主线程
			if (i==10) {
				t1.join();
			}
		}
	}

9.2:子线程B合并到子线程A中:合并之前,两个线程互抢资源,子线程B合并子线程A后,子线程B要先执行完,再执行子线程A.

eg:public class MyThead2 extends Thread{
	//声明一个属性,存线程对象
	public MyThead2 t;
	
	//通过构造方法给线程取名
	public MyThead2(String name) {
		super(name);
	}

	/**
	 * 重写父类中线程的任务方法
	 */
	@Override
	public void run() {
		for (int i = 1; i <=100; i++) {
			System.out.println(Thread.currentThread().getName()+":"+i);
			//如果线程A运行到10,
			if ("线程A".equals(Thread.currentThread().getName())&&i==10) {
				//让线程B合并过来,this指代当前线程A对象
				try {
					this.t.join();
				} catch (InterruptedException e) {
					// TODO Auto-generated catch block
					e.printStackTrace();
				}
			}
		}
	}
}

	public static void main(String[] args) {
		//创建线程对象
		MyThead2 t1=new MyThead2("线程A");
		MyThead2 t2=new MyThead2("线程B");
		
		//将线程B对象作为线程A对象的属性传过来
		t1.t=t2;
		
		//启动线程
		t1.start();
		t2.start();
	}

10.线程礼让:暂停一下当前线程正在执行任务或资源的抢占,再接着执行任务或抢占资源.

语法:Thread.yield() 或 线程对象.yield()

eg:public static void main(String[] args) {
		//创建子线程
		MyThead t1=new MyThead();
		
		//启动线程
		t1.start();
		
		for (int i = 1; i <=100; i++) {
			System.out.println(Thread.currentThread().getName()+":"+i);
			//主线程每运行一次就要礼让一下
			Thread.yield();
		}
	}

11.线程中断

11.1:用中断方法改变中断状态,再根据中断状态来中断线程.

eg:public class MyThead1 extends Thread{
	/**
	 * 重写父类中线程的任务方法
	 */
	@Override
	public void run() {
		for (int i = 1; i <=100; i++) {
			//判断子线程中断状态
			if (Thread.currentThread().isInterrupted()==true) {
				break;
			}
			System.out.println(Thread.currentThread().getName()+":"+i);
		}
	}
}

public static void main(String[] args) throws InterruptedException {
		//创建子线程
		MyThead1 t1=new MyThead1();
		//启动线程
		t1.start();
		
		for (int i = 1; i <=100; i++) {
			if (i==10) {
				t1.interrupt();//改变线程中断状态
				Thread.sleep(2000);
			}
			System.out.println(Thread.currentThread().getName()+":"+i);
		}
	}

11.2:在线程类中声明一个变量作标记,标记是否中断线程

eg:public class MyThead2 extends Thread{
	//声明一个变量作标记,标记是否中断线程,默认不中断
	public boolean flag=false;
	
	/**
	 * 重写父类中线程的任务方法
	 */
	@Override
	public void run() {
		for (int i = 1; i <=100; i++) {
			//根据标记判断子线程是否中断
			if (flag) {
				break;
			}
			System.out.println(Thread.currentThread().getName()+":"+i);
		}
	}
}

		public static void main(String[] args) throws InterruptedException {
		//创建子线程
		MyThead2 t1=new MyThead2();
		//启动线程
		t1.start();
		
		for (int i = 1; i <=100; i++) {
			if (i==10) {
				//改变线程中断标记
				t1.flag=true;
				Thread.sleep(2000);
			}
			System.out.println(Thread.currentThread().getName()+":"+i);
		}
	}

12.守护线程(后台线程,精灵线程):守护所有的非守护线程,当所有非守护线程全部死亡,那么守护线程无论有没有执行完都会死亡.

前提:在线程启动之前设置线程是否为守护线程.

语法:线程对象.setDaemon(boolean on)

eg:public static void main(String[] args) {
		//创建一个子线程
		MyThead t1=new MyThead();
		//将子线程设置为守护线程
		t1.setDaemon(true);
		//启动线程
		t1.start();
		
		for (int i = 1; i <=100; i++) {
			System.out.println(Thread.currentThread().getName()+":"+i);
			//子线程把资源抢过去,还得运行一下
		}
	}

13.线程生命周期:

新建状态:刚New出来的线程对象就处于新建状态.

就绪状态:当线程调用start()或当阻塞状态的线程醒来后就处于就绪状态.

运行状态:当就绪状态的线程抢到资源运行run()时就处于运行状态.

阻塞状态:当线程调用sleep()或wait()时就处于阻塞状态.

死亡状态:当线程再也不执行了就处于死亡状态.

1.临界资源问题:在同一个进程中有多个线程执行同一任务,有一个共享资源,当一个线程操作共享资源时,还没来得及修改,另一个线程把cpu时间片抢去了,又来操作共享资源,这时就出现.临界资源问题.

2.解决临界资源问题,要用到线程同步.

3.线程同步:让想一起执行代码绑定成一个代码块,一个线程进去执行这个代码块,其他线程就不能进去,只能在外面等待,等待代码块中线程执行完了,让代码块共享资源让出来,哪个线程抢到cpu时间片就可以进入代码块中执行了,这就是线程同步.

4.线程同步的方式:

4.1:同步代码块:有一个线程进入同步代码块自动上锁,这个线程对象把同步代码块中代码执行完了就会自动解锁.

4.1.1:语法:

synchronized (锁对象) {
	想要一起执行代码块;
 }

4.1.2:同步代码块锁对象可以是任何对象,只要这个锁对象是这多个线程共享,锁对象的值一般不变.

4.1.3:同步代码块中锁范围越小越好.

eg:public class MyRunnable implements Runnable {
	//声明一个成员变量存票数
	public int ticket=1000;
	
	//创建一个锁对象,所有线程共享
	Object ob=new Object();
	
	/**
	 * 实现父类的任务方法
	 */
	@Override
	public void run() {
		while (ticket>0) {//ticket=1
			//1,2,3
			//同步代码块
			synchronized (ob) {//1,2
				if (ticket>0) {
					System.out.println(Thread.currentThread().getName()+"正在销售第"+ticket+"张票");
					ticket--;
				}
			}
		}
	}
}

4.2:同步方法:

synchronized修饰方法 表示同一时间 只能有一个线程执行这个方法

线程中常用的方法 Java线程的核心方法集中在。 阅读详情

相关推荐

Java并发编程系列01:继承Thread类实现多线程

多线程学习1-->继承Thread类实现多线程 Thread类本质上也是实现了Runnable接口的一个类,启动线程的唯一方法就是通过Thread类的start()实例方法。start()方法是一个native方法,它将启动一个新线程,并执行run()方法。这种方式实现多线程很简单,通过自己的类直接extend Thread,并复写run()方法,就可以启动新线程并执行自己定义的run()方法。 例如: class MyThread extends Thread{ private i

fen_fen的专栏 1991

继承Thread类的方式实现多线程

package myMultithreadingDemo; public class MyThread extends Thread{ @Override public void run() { for (int i = 0; i < 100; i++) { System.out.println(i); } } } package myMultithreadingDemo; public class MyThread

he0707的博客 297

基于python的奥运会历史数据分析【120年】

数据分析实战案例

xff123456_的博客 3339

22. 多线程基础

1.进程: 系统进行资源分配调用的独立单元叫进程.每个进程都有自己独立内存空间和系统资源.(正在运行的程序) cpu时间片:指的是系统资源和内存空间. 2.线程: 进程中的一条执行线路.每个线程要执行一个任务.进程中所有线程共享当前这个进程中系统资源和内存空间. 同一个进程中多个线程之间是互抢资源竟争关系. 3.进程与线程的关系:一个进程中可以一个到多个线程;一个线程只属于一个进程. 4.实现线程:有三种实现方式,前两种公司常用,第三种基本不用. 4.1:继承Thread类,来实现线程 eg:

qq_44949002的博客 305

BIOS硬件监控实战:如何手动读取IT8738芯片的温度与风扇数据(附代码)

本文深入探讨了如何绕过操作系统和HWMonitor等监控软件,直接通过寄存器级操作读取IT8738超级I/O芯片的硬件监控数据。文章提供了从动态定位EC空间、构建底层读写函数到解码传感器寄存器映射的完整实战指南,并附有C语言代码示例,帮助开发者理解BIOS硬件监控的底层原理,适用于定制硬件开发与故障诊断。

weixin_29192211的博客 111

OpenWrt南京电信PPPoE IPv6配置:从零搭建稳定双栈网络

本文详细指导如何在南京电信PPPoE宽带环境下,为OpenWrt路由器配置稳定的IPv6双栈网络。核心在于正确设置WAN6接口为DHCPv6客户端,并请求/60前缀,同时配置LAN口分发地址并放行防火墙关键流量,确保内网设备获得原生IPv6连接。

water的专栏 1342

Java 多线程的实现方式(继承Thread类)

weixin_46441425的博客 507

用友U8其中一个账套提示演示期已到期-修复方法

【事件始末】 一朋友求助,反馈使用的用友U8,很多年了! 突然发现其中账套2021年的一个账套打不开,提示演示期限已到期! 但是其他账套完全正常,可以打开,没有任何问题。 不管是还原老旧备份,还是重装软件问题依旧,无法自己解决。 客户查询报表结算账期,情况比较紧急,于是求助我们。 经过多次反复琢磨和烟酒,终于于晚上23点59分给弄了出来,也总是圆满解决问题了。 【问题分析】 该用户打的是 U82X免狗补丁,估计是该补丁文件设置了 最大有效期,补丁到期了导致的。 也有可能是程序...

u010431289的博客 2万+

线程常用的方法

join()方法是指线程的插队。当前线程暂停执行,直到调用join()方法的线程执行完毕,此外,不影响其它线程的运行。以下就是一个案例当t1线程插队时,就先执行t1,然后再执行主线程,所以输出结果为。

m0_74776907的博客 805

深入理解C语言内存管理:堆与栈的区别

栈是一种遵循后进先出(LIFO)原则的数据结构。在程序中,栈用于存储局部变量、函数的参数以及函数调用时的返回地址等信息。栈的内存管理由操作系统自动进行,每次函数调用时都会在栈上分配一块内存区域,函数执行完毕后,该内存区域会自动释放。在C语言中,堆与栈是两种不同的内存分配方式,各自有着不同的特点和适用场景。栈内存自动管理,访问速度快,但大小有限,适用于存储局部变量和函数调用信息。堆内存由程序员手动管理,适用于存储动态数据结构,大小不受限制,但访问速度较慢,容易导致内存泄漏等问题。

set_one的博客 1582

从芯片选型到光学集成:手持激光测距仪硬件设计全解析

本文全面解析手持激光测距仪的硬件设计,从芯片选型到光学集成,详细介绍了相位法测距技术的核心原理与方案选择。通过模块化设计、信号链路优化及PCB布局技巧,实现毫米级精度。文章还分享了量产化关键控制点,帮助工程师规避常见设计陷阱,提升产品可靠性。

weixin_30425949的博客 445

Thread常用的方法及线程状态原因解析

(1)这是一个线程类,用来实例化线程对象(2)该类中,有很多方法。普通成员方法,可以使用对象的引用进行调用,像statr()方法等等;而静态方法,则需要通过类名去调用,如:Thread.sleep()等等。(3)我们通过Thread来实例化对象,产生的对象,我们默认称为“线程对象”,start()之后,线程才产生。因此,类中拥有的各种属性方法,我们后面就默认称为该线程的属性和方法。(4)线程,有哪些状态、属性,方法,本质上都是Thread中的;因此我们实例化出的线程,也就具有了。后续所说的线程。

2301_77053417的博客 2119

【24E】SWT6652 wifi驱动加载失败问题分析及解决方案

修改驱动配置Kconfig。是由于内存分配失败导致。

wgl307293845的博客 219

Java——》线程常用的方法

● start :启动线程 ● run :运行线程 ● currentThread :获取当前线程对象 ● getName :获取线程名称 ● sleep :将当前线程暂定指定的时间 ● isAlive :获取线程的状态 ● join :将当前线程和该线程合并,即等待该线程结束,在恢复当前线程的运行 ● yield :让出CPU,当前线程进入就绪状态 ● wait :阻塞,是Object中的方法 ● notify :唤醒,是Object中的方法 ● notifyAll :唤醒

小仙~ 1738

气象大模型光伏功率预测中的应用:从短期,超短期,中长期的实现与开源代码详解

本文详细介绍了基于大模型的光伏功率预测方法,涵盖超短期(15分钟-1小时)、短期(1-6小时)和中长期(1天-1周)预测。文章首先讨论了数据准备与预处理,包括历史功率、气象、天文和电站特性数据的收集与特征工程。随后,针对不同预测需求,提出了多种深度学习模型:超短期预测采用1DCNN-LSTM混合模型,短期预测使用Transformer模型,中长期预测则通过多尺度特征提取模型和概率预测方法处理不确定性。文章还提供了模型训练、评估、部署和优化的完整流程,并开源了代码实现。未来研究方向包括结合数值天气预报、开发时

专注AI大模型,软件混淆,授权 1584

NTscan扫描工具

ntscan是一个扫描器,可以扫描没有密码和弱密码的共享,先到配置文件中填写猜测的用户名和密码,扫描过程中右侧出现的是扫描日志。

线程二:线程的类和常用方法

1). 线程对象只有调用了 start() 方法后才会创建出真正的线程。2). 一个线程对象只能调用一次 start() 方法。

m0_73659744的博客 865

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

线程中的常用方法

1.线程方法概述 线程类Thead有很多方法方便我们调用,可以通过查看Java API找到线程中的所有方法。下面介绍一些线程中的常用方法。 2.线程中的基本方法 (1)public long getId( ) 该方法返回此线程的唯一ID,线程ID是线程的标识符。它是一个正的 long 数,在创建该线程时生成,如主线程的id通常为1。 虽然线程ID唯一,但并非终生不变。线程终止时,该线程 I...

forever-and-ever的博客 2080

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

Devexpress16.2.6破解工具

Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具

线程调用其他方法java_Java线程常用方法详解

线程的常用方法1.start(): 线程调用该方法将启动线程,使之从新建状态进入就绪队列排队,一旦轮到它来享用CPU资源时,就可以脱离创建它的线程独立开始自己的生命周期了。2.run(): Thread类的run()方法与Runnable接口中的run()方法的功能和作用相同,都用来定义线程对象被调度之后所执行的操作,都是系统自动调用而用户程序不得引用的方法。3.sleep(int millsec...

weixin_28957683的博客 1071

线程的常用方法

本文介绍了Java多线程编程中的几个关键方法:1)join()方法实现线程"插队",控制执行顺序,有阻塞主线程、释放锁等特点;2)interrupt()方法通过中断标志实现线程中断,需配合中断状态检测;3)yield()方法让出CPU执行权,但不保证切换;4)守护线程(setDaemon(true))在用户线程结束后自动终止。文章对比了这些方法与sleep()、wait()的区别,包括锁释放、唤醒条件等特性,并提供了代码示例说明各方法的典型应用场景和使用注意事项。

SHGXO183的博客 667

线程的常用方法有哪些?

线程常用方法有以下这些: start():启动线程,并调用线程的 run() 方法来执行任务。 run():线程的实际工作方法 (普通方法),定义线程要执行的任务。 sleep(long millis):暂停当前线程的执行,让线程进入阻塞状态,并释放 CPU 资源给其他线程使用,单位是毫秒。 join():将当前线程挂起,等待其他线程执行完毕后再继续执行。 interrupt():线程中断方法,而是给线程发送中断信号,可以配合 isInterrupted() 方法或Thread.interrupted()

dream_ready的博客 521

多线程--常用方法

前面我们学习到了多线程的一些概念,现在跟着我一起学习多线程的常用的方法吧。

liu3290607528的博客 291

线程常用构造方法及常用属性

线程构造方法和属性

qq_52463861的博客 295

Java多线程第二篇-线程的常用方法和线程安全

我们可以减少读取的次数,通过sleep睡眠来限定load的读取次数,此时就不会出发内存可见性问题,但是什么时候代码会被JVM优化,我们人是不清楚的,只有机器清除,所以我们尽量使用volatile更保险一些,此方法知道即可。这时候就陷入一种嵌套循环,形成死锁。如果有两把锁设a、b,线程1获取到锁a,然后线程2也获取到锁b,这时候线程1嵌套获取b锁,线程2嵌套获取a锁,则循环等待锁释放,进不去出不来。所谓的可重入锁,指的是一个线程,一把锁,加锁两次,会出现死锁,就是“不可重入“,反之,就是”可重入“。

Freedom的博客 2113

Java线程常用方法

线程常用方法:Thread.currentThread()、thread.setName("threadName")、thread.setPriority(0~10)、Thread.yield()、Thread.sleep(time)、thread.join()、thread.setDaemon(true)、notify()、wait()、thread.stop()、interrupt

min_chaoxi的博客 131
上一篇: java代码实现复制一个文件夹&独特流中的内存流、打印流、对象流(序列化和反序列化)
下一篇: Java中有6大设计原则&饿汉式单例模式&懒汉式单例模式&生产者和消费者模式
Java_LXM
博客等级 码龄7年 39粉丝 32原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值