首页 > 编程语言 >Java之线程实例(重要)

Java之线程实例(重要)

时间:2023-11-26 10:32:06浏览次数:34  
标签:Java System 实例 线程 println 异常 public out

接上一章没讲完的线程知识点中关于“死锁”的概念。

当线程进入不可运行状态时,其他线程无法访问那个加锁对象,所以一个线程会一直处于等待另一个线程的状态,而另一个线程又会处于等待下一个线程的状态,此时,所有的线程都陷入无休止的等待状态中,无法继续运行,这种情况就被称为线程的“死锁”。

线程死锁实例

package java_11_25;

public class ThreadDeadLock implements Runnable {

	public static boolean flag = true;
	private static Object A = new Object();
	private static Object B = new Object();

	public static void main(String[] args) {
		Runnable r1 = new ThreadDeadLock();
		Thread t1 = new Thread(r1);
		Runnable r2 = new ThreadDeadLock();
		Thread t2 = new Thread(r2);
		t1.start();
		t2.start();
	}

	public void AccessA() {
		flag = false;
		// 同步块
		synchronized (A) {
			System.out.println("线程t1 : 得到了A的锁");
			try {
				Thread.sleep(1000);
			} catch (Exception e) {
				// TODO: handle exception
				e.printStackTrace();
			}
			System.out.println("线程t1 : 还想要得到B的锁");
			synchronized (B) {
				System.out.println("线程t1 : 我得到了B的锁");
			}
		}
	}

	public void AccessB() {
		flag = true;
		synchronized (B) {
			System.out.println("线程t2 : 得到了B的锁");
			try {
				Thread.sleep(1000);
			} catch (Exception e) {
				// TODO: handle exception
				e.printStackTrace();
			}
			System.out.println("线程t2 : 还想要得到A的锁");
			synchronized (A) {
				System.out.println("线程t2 : 得到了A的锁");
			}
		}
	}

	@Override
	public void run() {
		// TODO Auto-generated method stub
		if (flag) {
			AccessA();
		} else {
			AccessB();
		}
	}
}

Java之线程实例(重要)_System

Java语言本身并没有提供防止死锁的具体方法,在具体程序设计时必须注意,以免出现死锁。通常注意不要使用stop()、suspend()、resume()及destroy()方法。

异常处理

在程序设计过程中通常会遇到两种不可避免的错误:编译错误和运行错误。

编译错误是由于编写的程序不符合程序的语法规定而导致的语法问题。

运行错误是指能够顺利地编译通过,在程序运行过程中产生的错误。

Java中的异常处理机制为程序提供了清晰的异常终止和错误处理的接口。当异常发生时,发生异常的方法抛出一个封装了错误消息的异常对象。此时程序不会继续运行,发生错误的方法也不会返回正常运行的值,异常处理机制开始搜索异常处理器来处理这种错误。

异常处理简单实例

package java_11_26;

public class ExceptionSimpleExample {

	public static void main(String[] args) {
		// TODO Auto-generated method stub
		try {
			System.out.println("try语句的执行");
			System.out.println("throw抛出异常");
			throw (new Exception("抛出Exception异常实例!"));
		} catch (Exception e) {
			// TODO: handle exception
			System.out.println("catch语句执行,捕获异常并处理");
			// 输出异常对象的异常描述信息到控制台
			System.out.println("toString()\n" + e.toString());
		} finally {
			System.out.println("finally语句的执行");
		}
	}
}

运行结果如图:

Java之线程实例(重要)_Java_02

Java异常类

Java异常类都是由Throwable类派生而来的,派生出来的两个分支分别为Error类和Exception类。

异常类的层次结构如下所示:

Java之线程实例(重要)_Java_03

Tips:Throwable类位于java.lang包中。

异常处理的方法

Exception异常类继承了父类Throwable的若干方法,包括:

public String toString();

返回异常对象的异常描述信息:

public String getMessage();

返回异常对象的详尽描述信息(包括输出异常的性质和类型):

public void printStackTrace();

使用异常类对象处理输出异常信息的实例:

package java_11_26;

public class ExceptionOutput {

	public static void main(String[] args) {
		// TODO Auto-generated method stub
		try {
			int i = 5 / 0;
		} catch (Exception e) {
			// TODO: handle exception
			System.out.println("toString()\n" + e.toString());
			System.out.println("toString()\n" + e.getMessage());
			System.out.println("printStackTrace()");
			e.printStackTrace();
		}
	}
}

运行结果如下:

Java之线程实例(重要)_java_04

异常捕获

为了捕获异常,需要使用catch语句块配合try语句块。

try语句块内部如果出现异常,那么程序将跳过try语句块中出现异常的语句之后的其它代码,直接进入catch语句块内执行代码。

异常捕获处理语句块的实例:

package java_11_26;

public class CatchException {

	public static void main(String[] args) {
		// TODO Auto-generated method stub
		try {
			int i = Integer.parseInt("tree");
			// 输出信息,由于抛出异常,这句话将不显示
			System.out.println("IllegalArgumentException will not show!" + i);
		} catch (Exception e) { // 捕获异常
			// TODO: handle exception
			// 打印异常的类型及在程序中的位置等信息
			System.out.println("printStackTrace()");
			e.printStackTrace();
		}
	}
}

Java之线程实例(重要)_java_05

try-catch语句块可以嵌套使用。

实例如下:

package java_11_26;

public class TrynestdealException {

	public static void main(String[] args) {
		// TODO Auto-generated method stub
		tryCatch();
	}

	private static void tryCatch() {
		// TODO Auto-generated method stub
		try {
			try {
				System.out.println("执行里层try块\n");
				int inte = Integer.parseInt("pencil"); // 字符串转换成整数
				System.out.println(inte);
			} catch (ArrayIndexOutOfBoundsException e) {
				// TODO: handle exception
				System.out.println("执行里层catch1块\n");
				System.out.println("捕获ArrayIndexOutOfBoundsException异常:" + e.getMessage());
			} catch (ArithmeticException e) {
				// TODO: handle exception
				System.out.println("执行里层catch2块\n");
				System.out.println("捕获ArithmeticException异常:" + e.getMessage());
			}
		} catch (ClassCastException ie) {
			// TODO: handle exception
			System.out.println("捕获外层异常ClassCastException:" + ie.getMessage());
		} catch (NumberFormatException ie) {
			// TODO: handle exception
			System.out.println("捕获外层异常NumberFormatException:" + ie.getMessage());
		}
	}
}

运行结果如下:

Java之线程实例(重要)_System_06

注意,如果程序的主函数main()为静态函数,那么,由于静态函数不能调用非静态函数,所以tryCatch()函数必须定义成静态类型。


标签:Java,System,实例,线程,println,异常,public,out
From: https://blog.51cto.com/u_16174658/8567877

相关文章

  • Java中MongoDB操作
    Java中对MongoDB的操作本文介绍了使用Java编程语言与MongoDB进行交互的基本操作。MongoDB是一个开源的文档数据库,它提供了高性能、可扩展性和灵活的数据存储解决方案。安装MongoDB驱动程序在开始之前,我们需要安装MongoDB的Java驱动程序。你可以通过Maven或手动下载MongoDB驱动程序......
  • 使用JavaWeb实现文件的上传和下载
    文件上传[文件上传的注意事项]1.为保证服务器安全,上传文件应该放在外界无法直接访问的目录下,比如放于WEB-INF目录下。2.为防止文件覆盖的现象发生,要为上传文件产生一个唯一的文件名3.要限制上传文件的最大值。4.可以限制上传文件的类型,在收到上传文件名时,判断后缀名是否合......
  • java读取照片Exif信息到实体类
    前言1.总共读出来了228个参数信息,但是我挑选了36个我认为比较有价值的参数,弄成了实体类(其实是因为很多参数我看不明白是啥意思)2.为了方便,所以实体类里我直接用中文字段了效果图导入依赖<!--读取照片元信息--><dependency><groupId>com.dre......
  • java处理前端传来的金额并转化为分
    在Java中,可以使用BigDecimal类来处理金额importjava.math.BigDecimal;publicclassMain{publicstaticvoidmain(String[]args){BigDecimalamount=newBigDecimal("1234.56");System.out.println("原始金额:"+amount);//对金额进行操作,例如加法、减法、乘法......
  • java如何分割字符串?
    在Java中,可以使用split()方法来分割字符串。split()方法接受一个正则表达式作为参数,根据该正则表达式将字符串分割成一个字符串数组。publicclassMain{publicstaticvoidmain(String[]args){Stringstr="Hello,World,Java";String[]parts=str......
  • JavaScript ajax下载文件
     JavaScriptAjaxhttpget方法,利用a标签下载文件流。文件流:django返回文件流示例fromdjango.httpimportStreamingHttpResponseclassDownloadExportExcel(View):defget(self,request,*args,**kwargs):file_name=request.GET.get("filename")......
  • ElasticSearch之线程的数量
    ElasticSearch在运行过程中,涉及多种线程池、线程的使用,因此而需要给予足够的线程资源,保证ElasticSearch在需要时可以正常创建出线程。查看Linux系统当前用户允许创建的线程的数量,命令如下:ulimit-a执行结果的样例,如下:corefilesize(blocks,-c)0datasegsize......
  • 使用conditional 实现线程精准通讯
    实现3个线程之间依次执行比如有3个线程A,B,C,需要按照顺序执行,ABC,ABC依次执行。这个使用可以使用Lock的conditional来实现线程之间精准通讯。点击查看代码packagecom.study.juc;importjava.util.concurrent.locks.Condition;importjava.util.concurrent.locks.Loc......
  • Day03 JavaSE介绍与安装卸载
    1.Java三大版本javaSE:标准版(桌面程序,控制台程序开发)JavaME:精简版(嵌入式开发)javaEE:企业级开发(web开发,服务器开发)2.JDK、JRE、JVMJDK:javadevelopmentkitJRE:javaruntimeenvirnmentJVM:javavirtualmachine其中JDK包含了JRE与JVM。JRE包含了JVM。安装了JRE后......
  • Java中static、final、static final的区别
    finalfinal可以修饰:属性,方法,类,局部变量(方法中的变量)final修饰的属性的初始化可以在编译期,也可以在运行期,初始化后不能被改变。final修饰的属性跟具体对象有关,在运行期初始化的final属性,不同对象可以有不同的值。final修饰的属性表明是一个常数(创建后不能被修改)。final修饰的方......