Java之多线程

1.多线程

概述:线程是程序执行的一条路径, 一个进程中可以包含多条线程,多线程并发执行可以提高程序的效率, 可以同时完成多项工作。

1.1并行和并发

  • 并行:两个任务同时运行,即甲在运行的同时,乙也在运行(需要多核CPU)
  • 并发:两个任务都请求运行,而处理器只接受一个任务,就把这两个任务安排轮流进行,由于时间间隔短,两个任务感觉在同时运行。

1.2多线程的几种实现方式

1.2.1继承Thread,重写run方法
	public class Demo_Thread {
		public static void main(String[] args) {
			MyThread mt = new MyThread();
			mt.start();
		}
	}
	class MyThread extends Thread{
		public void run(){
			for(int i=0;i<10000;i++){
				System.out.println("hhhhhhhhhh");
			}
		}
	}
匿名内部类实现:
public class Demo_Thread {
	public static void main(String[] args) {
		new Thread(){
			public void run(){
				for(int i=0;i<10000;i++){
					System.out.println("匿名内部类hhhhhhhhhh");
				}
			}
		}.start();
	}
}
1.2.2实现Runnable接口,重写run方法

通过实现Runnable接口,实现run方法,接口的实现类的实例作为Thread的target作为参数传入带参的Thread构造函数,通过调用start()方法启动线程

public class Demo_Runnable {
	public static void main(String[] args) {
		MyRunnable mr=new MyRunnable();
		Thread t=new Thread(mr);
		t.start();
	}
}
class MyRunnable implements Runnable{
	@Override
	public void run() {
		for(int i=0;i<10000;i++){
			System.out.println("hhhhhhhhhh");
		}
	}	
}
②匿名内部类实现:
public class Demo_Thread {
	public static void main(String[] args) {
		new Thread(new Runnable() {
			@Override
			public void run() {
				for(int i=0;i<10000;i++){
					System.out.println("匿名内部类hhhhhhhhhh");
				}
			}
		}).start();
	}
}

两种方式的区别:

  • 继承Thread:由于子类重写了Thread中的run(),当调用start()时,直接找子类的run()方法。
  • 实现Runnable():构造函数中传入了Runnable的引用,成员变量记住了他,start()调用run()方法时内部判断成员变量Runnable的引用是否为空,不为空编译时看的是Runnable的run(),运行时执行的是子类的run()方法

1.3获取线程名字和设置名字

  • 通过getName()方法获取名字
  • 通过构造参数或者setName()方法设置名字
//构造方法
new Thread("程序汪"){
			public void run(){
				//this.setName("程序汪");
				System.out.println(this.getName()+"....hhhhhh");
			}
		}.start();
//setName()方法
new Thread(){
			public void run(){
				this.setName("程序汪");
				System.out.println(this.getName()+"....hhhhhh");
			}
		}.start();

在这里插入图片描述

1.4获取当前线程的对象

概述:Thread.currentThread(), 主线程也可以获取。为Runnable()提供了方便

new Thread(new Runnable() {
			public void run() {
				Thread.currentThread().setName("程序员");
				System.out.println(Thread.currentThread().getName()+"...hhhh");
			}
		}).start();

在这里插入图片描述

1.5.1休眠线程

sleep(long millis) :使当前正在执行的线程以指定的毫秒数暂停(暂时停止执行),具体取决于系统定时器和调度程序的精度和准确性。

	for(int i=5;i>0;i--){
			Thread.sleep(1000);
			System.out.println("倒计时"+i+"秒");
		}

在这里插入图片描述

1.5.2守护线程

概述:setDaemon(), 设置一个线程为守护线程, 该线程不会单独执行, 当其他非守护线程都执行结束后, 自动退出。

		Thread t1 = new Thread() {
			public void run() {
				for(int i = 0; i < 2; i++) {
					System.out.println(getName() + "...aaaaaaaaaaaaaaaaaaaa");
				}
			}
		};
		Thread t2 = new Thread() {
			public void run() {
				for(int i = 0; i < 50; i++) {
					System.out.println(getName() + "...bb");
				}
			}
		};
		
		t2.setDaemon(true);							//设置为守护线程
		t1.start();
		t2.start();
1.5.3加入进程

join(), 当前线程暂停, 等待指定的线程执行结束后, 当前线程再继续
join(int), 可以等待指定的毫秒之后继续

final Thread t1 = new Thread() {
			public void run() {
				for(int i = 0; i < 50; i++) {
					System.out.println(getName() + "...aaaaaaaaaaaaaaaaaaaa");
				}
			}
		};
		Thread t2 = new Thread() {
			public void run() {
				for(int i = 0; i < 50; i++) {
					if(i==2){
						try {
							t1.join(1);
						} catch (InterruptedException e) {
							// TODO Auto-generated catch block
							e.printStackTrace();
						}
					}
					System.out.println(getName() + "...bb");
				}
			}
		};
		t1.start();
		t2.start();
1.5.4礼让线程

yield让出cpu

1.5.5设置 线程优先级

概述:setPriority()设置线程的优先级,效果不太明显
例如:

Thread t1 = new Thread() {
			public void run() {
				for(int i = 0; i < 100; i++) {
					System.out.println(getName() + "...aaaaaaaaaaaaaaaaaaaa");
				}
			}
		};
		Thread t2 = new Thread() {
			public void run() {
				for(int i = 0; i < 100; i++) {
					System.out.println(getName() + "...bbbbbbbbbbbbbbbbb");
				}
			}
		};
		t1.setPriority(10);
		t2.setPriority(1);
		t1.start();

运行截图未给出,自己可尝试运行看结果。

1.6.1同步代码块

概述: 当多线程并发, 有多段代码同时执行时, 我们希望某一段代码执行的过程中CPU不要切换到其他线程工作. 这时就需要同步。如果两段代码是同步的, 那么同一时间只能执行一段, 在一段代码没执行结束之前, 不会执行另外一段代码.
如果同步代码块就有可能出现以下情况。

Demo demo=new Demo();
		new Thread(){
			public void run(){
				while(true){
					demo.print1();
				}
			}
		}.start();
		new Thread(){
			public void run(){
				while(true){
					demo.print2();
				}
			}
		}.start();
class Demo{
	public void print1(){
		System.out.print("程");
		System.out.print("序");
		System.out.print("员");
		System.out.println();
	}
	public void print2(){
		System.out.print("撸");
		System.out.print("代");
		System.out.print("码");
		System.out.println();
	}
}

在这里插入图片描述
同步代码块以后:
主方法不变
:锁对象为任意对象,但是被锁的代码需要保证是同一把锁,不能使用匿名对象。

class Demo{
	Demo1 demo1=new Demo1();
	public void print1(){
		synchronized (demo1) {
			System.out.print("程");
			System.out.print("序");
			System.out.print("员");
			System.out.println();
		}
	}
	public void print2(){
		synchronized (demo1) {
			System.out.print("撸");
			System.out.print("代");
			System.out.print("码");
			System.out.println();
		}	
	}
}
class Demo1{
	
}

运行结果不会再有未完成当前操作就切换CPU的操作。
运行结构

1.6.2同步方法

使用synchronized关键字修饰一个方法, 该方法中所有的代码都是同步的
非静态同步函数的锁是:this
静态的同步函数的锁是:字节码对象

class Demo{
	public synchronized void print1(){
			System.out.print("程");
			System.out.print("序");
			System.out.print("员");
			System.out.println();
	}
	public void print2(){
		synchronized (this) {
			System.out.print("撸");
			System.out.print("代");
			System.out.print("码");
			System.out.println();
		}	
	}
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
资源包主要包含以下内容: ASP项目源码:每个资源包中都包含完整的ASP项目源码,这些源码采用了经典的ASP技术开发,结构清晰、注释详细,帮助用户轻松理解整个项目的逻辑和实现方式。通过这些源码,用户可以学习到ASP的基本语法、服务器端脚本编写方法、数据库操作、用户权限管理等关键技术。 数据库设计文件:为了方便用户更好地理解系统的后台逻辑,每个项目中都附带了完整的数据库设计文件。这些文件通常包括数据库结构图、数据表设计文档,以及示例数据SQL脚本。用户可以通过这些文件快速搭建项目所需的数据库环境,并了解各个数据表之间的关系和作用。 详细的开发文档:每个资源包都附有详细的开发文档,文档内容包括项目背景介绍、功能模块说明、系统流程图、用户界面设计以及关键代码解析等。这些文档为用户提供了深入的学习材料,使得即便是从零开始的开发者也能逐步掌握项目开发的全过程。 项目演示与使用指南:为帮助用户更好地理解和使用这些ASP项目,每个资源包中都包含项目的演示文件和使用指南。演示文件通常以视频或图文形式展示项目的主要功能和操作流程,使用指南则详细说明了如何配置开发环境、部署项目以及常见问题的解决方法。 毕业设计参考:对于正在准备毕业设计的学生来说,这些资源包是绝佳的参考材料。每个项目不仅功能完善、结构清晰,还符合常见的毕业设计要求和标准。通过这些项目,学生可以学习到如何从零开始构建一个完整的Web系统,并积累丰富的项目经验。
资源包主要包含以下内容: ASP项目源码:每个资源包中都包含完整的ASP项目源码,这些源码采用了经典的ASP技术开发,结构清晰、注释详细,帮助用户轻松理解整个项目的逻辑和实现方式。通过这些源码,用户可以学习到ASP的基本语法、服务器端脚本编写方法、数据库操作、用户权限管理等关键技术。 数据库设计文件:为了方便用户更好地理解系统的后台逻辑,每个项目中都附带了完整的数据库设计文件。这些文件通常包括数据库结构图、数据表设计文档,以及示例数据SQL脚本。用户可以通过这些文件快速搭建项目所需的数据库环境,并了解各个数据表之间的关系和作用。 详细的开发文档:每个资源包都附有详细的开发文档,文档内容包括项目背景介绍、功能模块说明、系统流程图、用户界面设计以及关键代码解析等。这些文档为用户提供了深入的学习材料,使得即便是从零开始的开发者也能逐步掌握项目开发的全过程。 项目演示与使用指南:为帮助用户更好地理解和使用这些ASP项目,每个资源包中都包含项目的演示文件和使用指南。演示文件通常以视频或图文形式展示项目的主要功能和操作流程,使用指南则详细说明了如何配置开发环境、部署项目以及常见问题的解决方法。 毕业设计参考:对于正在准备毕业设计的学生来说,这些资源包是绝佳的参考材料。每个项目不仅功能完善、结构清晰,还符合常见的毕业设计要求和标准。通过这些项目,学生可以学习到如何从零开始构建一个完整的Web系统,并积累丰富的项目经验。
资源包主要包含以下内容: ASP项目源码:每个资源包中都包含完整的ASP项目源码,这些源码采用了经典的ASP技术开发,结构清晰、注释详细,帮助用户轻松理解整个项目的逻辑和实现方式。通过这些源码,用户可以学习到ASP的基本语法、服务器端脚本编写方法、数据库操作、用户权限管理等关键技术。 数据库设计文件:为了方便用户更好地理解系统的后台逻辑,每个项目中都附带了完整的数据库设计文件。这些文件通常包括数据库结构图、数据表设计文档,以及示例数据SQL脚本。用户可以通过这些文件快速搭建项目所需的数据库环境,并了解各个数据表之间的关系和作用。 详细的开发文档:每个资源包都附有详细的开发文档,文档内容包括项目背景介绍、功能模块说明、系统流程图、用户界面设计以及关键代码解析等。这些文档为用户提供了深入的学习材料,使得即便是从零开始的开发者也能逐步掌握项目开发的全过程。 项目演示与使用指南:为帮助用户更好地理解和使用这些ASP项目,每个资源包中都包含项目的演示文件和使用指南。演示文件通常以视频或图文形式展示项目的主要功能和操作流程,使用指南则详细说明了如何配置开发环境、部署项目以及常见问题的解决方法。 毕业设计参考:对于正在准备毕业设计的学生来说,这些资源包是绝佳的参考材料。每个项目不仅功能完善、结构清晰,还符合常见的毕业设计要求和标准。通过这些项目,学生可以学习到如何从零开始构建一个完整的Web系统,并积累丰富的项目经验。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值