多线程的一些小问题集锦

2023-11-15

1、线程死亡之后不能再次启动

测试线程是否已经死亡,可以调用isAlive()方法.当线程处于就绪、运行、阻塞三种状态时,返回true;当线程处于死亡、新建状态时返回false。

实例代码如下:

package com.thread;

public class StartDead extends Thread{
	   private int i;
	   @Override
	public void run() {
		 for(;i<100;i++){
			 System.out.println(getName()+"  "+i);
		 } 
	}
	public static void main(String[] args) {
		//创建线程对象
		StartDead sd=new StartDead();
		for(int i=0;i<300;i++){
			System.out.println(Thread.currentThread().getName()+"  "+i);
			if(i==20){
				//启动线程】
				sd.start();
				//判断启动后线程的isAlive()值,返回true
				System.out.println(sd.isAlive());
			}
		    //只有当线程处于新建、死亡两种状态时,isAlive()返回false
			  if(i>20&&!sd.isAlive()){
				 //试图再次启动该线程
				  try {
					sd.start();

				} catch (Exception e) {
	             System.out.println(sd.getName()+"线程已经死亡,无法再次启动!");
					 
				}	 }
		}
	}
}


 

运行上面代码我们可以发现,对已经死亡的线程,调用start()方法会抛出异常!

注意:不要对已经死亡的线程调用start()方法,程序只能对新建状态的线程调用start()方法,对新建线程两次调用start()方法也是错误的!

2.控制线程的运行

2.1  join()方法

join()方法有三种重载方式。

join(): 等待被join的线程执行完成.

join(long millis) :等待被join的时间最长为 .. millis。如果在..millis内,被join()的线程还没有完成,讲不再等待.

join(long millis,int nanos):等待被join的线程最长为..millis毫秒加上nanos微秒.

好吧,来个具体的例子看看下:

package com.thread; 

public class JoinThread{
	
	public static void main(String[] args) {
	     //启动子线程
	     Thread t1=new Thread(new MyJoinThread(),"新线程");
         t1.start();
         //运行主线程
         for(int i=0;i<100;i++){
        	 if(i==20){
        		 
        		 Thread t2=new Thread(new MyJoinThread(),"被Join的线程");
        		 t2.start();
        		 try {
        			 //mian 线程调用了t2线程的join()方法,main线程必须等待t2完成之后才能执行.
					 t2.join();
				} catch (InterruptedException e) {
					e.printStackTrace();
				}
        	 }
        	 
        	 System.out.println(Thread.currentThread().getName()+" "+i);
         }
        
	}
}

class MyJoinThread implements Runnable {
  
    //重写run()方法,定义线程执行体
	public void run() {
		for (int i=0;i<100;i++){
			System.out.println(Thread.currentThread().getName()+"  "+i);
		}
		
	}
}


输出的结果如下,每次运行都不一样:

新线程  14
main 16
main 17
main 18
main 19
新线程  15
新线程  16
新线程  17
新线程  18
新线程  19
新线程  20
新线程  21
新线程  22
新线程  23
新线程  24
新线程  25
新线程  26
被Join的线程  0
新线程       27
被Join的线程  1
被Join的线程  2

由上述结果可以看出,当主线程的i=20的时候,主线程阻塞,直到被join的线程执行完才可以!在i=20之前,“新线程”和"main"线程交替执行,i=20之后,“新线程”和“join线程交替执行”.

 

2.2.后台线程

如果将某个线程设置为后台线程,必须在该线程启动之前设置,也就是说start()方法必须在setDaemon(true)方法之后,否则会抛出异常!

 

 2.3 线程睡眠

static void sleep(long millis)  ,让当前正在执行的线程暂停millis毫秒,并进入阻塞状态。调用sleep()不会释放对象锁!

package com.thread;

public class ThreadSleep {
	public static void main(String[] args) {
		Thread t=new Thread(new MySleep());
		t.start();
	}
}
class MySleep implements Runnable{
	public void run() {	
		for(int i=0;i<10;i++){
		   	System.out.println(Thread.currentThread().getName()+"  "+i);
			try {
				 Thread.sleep(1000);
			}   catch (InterruptedException e) {
				e.printStackTrace();
			}
		}	
	}	
}

 还有其它的一些小问题,有时间再补充吧!

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

多线程的一些小问题集锦 的相关文章

  • Activiti7与SpringBoot整合开发

    SpringBoot 整合 Activti7 的具体步骤大概包括以下4步 1 添加 SpringBoot 整合 Activti7 的相关jar包 2 添加 SpringSecurity 安全框架的整合配置信息 3 使用 Activti7 新

随机推荐

  • 用递归解决八皇后问题

    单纯用递归解决该问题 就是利用一个一维数组表示出每种解 例如arry n i 其中n表示第n行的棋子 而 i 表示该 行的棋子所在列的位置 该问题可以用贪心算法进行优化 这是针对初学者练习递归时的一种解决办法 该代码并不是为了优化解决问题
  • flutter 开发踩坑集

    一 TextField设置高度后 文字无法居中 解决方案 TextField style TextStyle decoration InputDecoration prefixIcon ImageUtils getImage search
  • 区块链技术发展现状与展望 论文阅读摘要(袁勇、王飞跃)

    阅读摘要
  • 前端代码审查和测试

    检查代码的概念和过程 来自百度回答 https zhidao baidu com question 499002410583455364 html 1 代码检查法 1 桌面检查 这是一种传统的检查方法 由程序员检查自己编写的程序 程序员在程
  • GPT带我学-设计模式-命令模式

    1 你知道设计模式的命令模式吗 是的 我知道设计模式中的命令模式 命令模式是一种行为型设计模式 它将请求封装成一个对象 从而允许使用不同的请求 队列或日志来参数化其他对象 命令模式还支持撤销操作 并且可以提供事务的实现 在命令模式中 有四个
  • 机器学习——RBF神经网络

    RBF神经网络 本文部分资料与案例来源 MATLAB神经网络43个案例分析 RBF神经网络简述 再介绍RBF神经网络之前我们先来看一下径向基函数 RBF 在百度百科上 RBF定义如下 径向基函数是一个取值仅仅依赖于离原点距离的实值函数 也就
  • 未能加载文件或程序集“Newtonsoft.Json, Version=4.5.0.0"[已解决]

    前两天升级系统架构 升级后打开网页报错了 详细信息如下 未能加载文件或程序集 Newtonsoft Json Version 4 5 0 0 Culture neutral PublicKeyToken 30ad4fe6b2a6aeed 或
  • PHP架构师成长路线,PHP架构师要求

    在软件开发圈 架构师 是一个受万人追捧的头衔 架构师给人的感觉是站在软件系统后面指点江山的诸葛亮 一个系统的如何运作 运作得如何 架构师都能提前设想出来 然而 梦想是美好的 现实却是残酷的 很多人在实际工作后就会发现 梦想是成为大牛 但做的
  • 当对比学习遇上prompt,擦出了怎样的火花……

    细数最近NLP领域的热门关键词 transformer 多模态 预训练 还有不得不提的prompt 本质上说 prompt是一种激发语言模型中知识的手段 随着prompting技术的大火 有越来越多的研究者在思考 Prompt 除了让这个方
  • vue3 antd pro 框架动态路由

    此框架中路由权限使用了两种方法 主要介绍第二种方法 从路由表构建路由 前端对比后端权限字段过滤静态路由表 即 前端配置好全部的路由表 然后根据权限来与后端获取到的进行对比 最终展示对比后的数据 从后端获取路由表结构体 并构建前端路由 从后端
  • ubuntu的使用--系统目录篇(文末附Desktop目录位置)

    Ubuntu的Desktop 桌面 的目录是什么 ubuntu下的系统目录是什么样子的 1 cd命令技巧 直接进入用户的home目录 cd 进入上一个目录 cd 进入当前目录的上一层目录 cd 进入当前目录的上两层目录 cd 2 每次初始打
  • navicat 传输和同步

    同步 如果表存在 数据相同的则留 不同的则删除 然后插入目的表不存在的数据 同步相当于两个数据库表的数据拿出来比对是否有差异 传输 直接删表 插入源表数据 传输是一个数据表的数据进行插入 优缺点 这样比较的话 同步占内存但是快 适合数据量少
  • IDA反编译的几个注意和技巧

    IDA逆向程序的经验总结 关于一些类型转换以及指针和地址的总结 关于F5汇编代码不能转成c的伪代码的几个问题总结 1 jmpout的问题 2 positive sp value has been found 的问题 3 call analy
  • Java反射机制的学习

    转自 http www cnblogs com keis archive 2011 03 29 1998736 html Java反射机制是Java语言被视为准动态语言的关键性质 Java反射机制的核心就是允许在运行时通过Java Refl
  • Spring Boot 集成 Activiti7(工作流)

    Spring Boot 集成 Activiti7 工作流 本章节将介绍 Spring Boot 集成 Activiti7 工作流 Spring Boot 2 x 实践案例 代码仓库 介绍 Activiti 是一个工作流引擎 它可以将业务系统
  • 系统架构设计知识梳理--分布式架构

    CAP理论 C 一致性 一般指强一致性 A 可用性 常见指标TP999 P 分区容错性 其中一致性与可用性存在矛盾 需要开发者根据实际业务取舍 一致性解决方案 Raft算法 原理是将集群中所有服务归为三类角色 leader 领导者 foll
  • 高级应用:内部类的设计模式与内部类与外部类之间的交互

    1 内部类与外部类之间的交互 内部类与外部类之间可以相互访问对方的私有成员 这为程序设计提供了更大的灵活性和可扩展性 public class Outer private int outerVar public Outer int oute
  • 【图像分类】基于卷积神经网络和主动学习的高光谱图像分类(Matlab代码实现)

    欢迎来到本博客 博主优势 博客内容尽量做到思维缜密 逻辑清晰 为了方便读者 座右铭 行百里者 半于九十 本文目录如下 目录 1 概述 2 运行结果 3 参考文献 4 Matlab代码实现 1 概述 文献来源 深度神经网络最近已广泛应用于高光
  • android studio里查看一个类的帮助及其成员的方法

    在Android studio里 按f1仅仅是查看关于这工具本身的帮助 这点与Qt Creator不同 要想查看一个类及其成员的说明时 就不能简单的按 F1 键了 一 增加光标定住在一个类名或一个函数时 自动弹出相应的提供 如下图 光标在
  • 多线程的一些小问题集锦

    1 线程死亡之后不能再次启动 测试线程是否已经死亡 可以调用isAlive 方法 当线程处于就绪 运行 阻塞三种状态时 返回true 当线程处于死亡 新建状态时返回false 实例代码如下 package com thread public