java——线程总结

进程和线程的区别

进程是一个应用程序,线程是进程的一部分。进程是由多个线程组成的。
进程与进程之间相互独立,互不影响,资源不共享。
而线程之间,栈内存相互独立(一个栈是一个线程),但堆内存和方法区共享。如下图:在这里插入图片描述

创建线程的两种方式

第一种:编写一个类,直接继承java.lang.Thread,然后重写run方法,在run方法中写线程执行的内容。要调用线程,就要调用线程对象的start方法。

public class 线程 {
	public static void main(String[] args) {
		Thr t=new Thr();
		t.start();
		for(int i=0;i<50;i++) 
			System.out.println(2);
	}
}
class Thr extends Thread{
	public void run() {
		for(int i=0;i<50;i++) 
			System.out.println(1);
	}
}

上述代码中:t.start()方法的任务是开辟一个栈内存区,存入run方法帧,该栈与main方法栈各自执行,互不干扰。

第二种: 编写一个类,实现Runnable接口,然后用Thread类创建对象,传入实现Runnable的类的对象。此时,该线程对象的run方法是实现Runnable接口类中的run方法。注意: 实现Runnable接口后会要求实现给接口中的抽象方法run

使用接口比继承Thread用的要多,因为如果继承Thread类,该类就不能再继承其他的类。

第三种采用匿名内部类的方式,如下列代码:

Thread th=new Thread(new Runnable() {
			public void run() {
					for(int i=0;i<50;i++) 
						System.out.println(1);
			}
		});
		
		th.start();
		for(int i=0;i<50;i++)
			System.out.println(2);

线程的生命周期

在这里插入图片描述

线程对象的名字

创建一个线程对象后,默认的线程名字为Thread-0或Thread-1等累加下去,可以通过方法setName设置线程的名字,还可以通过getName方法获取线程名字,返回String类型变量。

获取当前线程对象

在某个线程中执行Thread th=Thread.currentThread()可以获取当前线程对象。currentThread是Thread类中一个静态方法。

sleep方法和interrupt方法

1、sleep方法返回值未空,可以传入一个long型参数,表示当前线程休眠的时间,单位是毫秒,执行sleep方法后,当前线程进行了阻塞态。
注意:sleep方法是一个静态方法,如果用对象进行调用,与调用该方法的对象无关,sleep方法出现在哪个线程就让哪个线程休眠,如下列代码:

public class 线程 {
	public static void main(String[] args) {
		Thr t=new Thr();
		t.start();
		
		try {
			t.sleep(5*1000);
		} catch (InterruptedException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		System.out.println(t.getName());
	}
}
class Thr extends Thread{
	@Override
	public void run() {
		for(int i=0;i<50;i++) {
			System.out.println(1);
		}
	}
}

以上程序先打印for循环的50个数字,5秒之后才执行t.getName(),即t.sleep()是让main方法主线程休眠,因为该方法的调用是出现在主线程中。

2、interrupt方法是让正在睡眠的线程结束随眠,从阻塞态进入就绪态,如下列代码:

public class 线程 {
	public static void main(String[] args) {
		Thr t=new Thr();
		t.start();
		
		for(int i=0;i<10;i++) 
			System.out.println("main");
		
		t.interrupt();
	}
}
class Thr extends Thread{
	@Override
	public void run() throws RuntimeException{
		try {
			Thread.sleep(5*1000*444*555);
		} catch (InterruptedException e) {
			e.printStackTrace();
		}
		for(int i=0;i<50;i++) 
			System.out.println(1);
	}
}

以上代码在输出10次mai后,线程Thr被唤醒,输出50次1,。
interrupt方法的原理是导致sleep方法出现异常,进入catch语句,从而结束睡眠,以上代码执行interrupt方法后,会执行e.printStackTrace();打印异常信息,才开始执行输出50个1.

线程的终止

1、stop方法(已过时),该方法会使线程消亡,会导致线程中未保存的数据丢失,故不再使用该方法。
2、标记法,在线程类中定义一个布尔变量flag,默认值为true,在run方法中,使用if_else语句,结构如下

class myRun implements Runnable{
	boolean flag=true;
	public void run() {
		if(flag) {
			//线程内容
		}else {
				//此处保存数据
				return;
			}
		}
	}
}

要结束线程,只需将flag值该为false,就可以进入else语句块,保存数据后,结束run方法。如下列例子:

public class 线程终止 {
	public static void main(String[] args) {
		myRun myRunable=new myRun();
		Thread th=new Thread(myRunable);
		th.start();
		try {
			Thread.sleep(1000*5);
		} catch (InterruptedException e) {
			e.printStackTrace();
		}
		myRunable.flag=false;
	}
}

class myRun implements Runnable{
	boolean flag=true;
	public void run() {
		for(int i=0;i<30;i++) {
			if(flag) {
				System.out.println(Thread.currentThread().getName()+"-->"+i);
				try {
					Thread.sleep(1000);
				} catch (InterruptedException e) {
					e.printStackTrace();
				}
			}else {
				System.out.println("线程结束,保存数据");
				return;
			}
		}
	}
}

主线程休眠5秒后,让th线程执行了5秒,输出了5次,然后主线程执行myRunable.flag=false;结束了th线程。

线程调度

线程优先级

线程优先级是线抢占CPU的能力指标,多个线程并发时,优先级越高的线程抢占的cpu时间片更多。
最低优先级是1
最高优先级是10
默认优先级是5

优先级可以通过setsetPriority(int pri)来设置线程的优先级,通过getPriority()来获取线程的优先级(返回值为int)。

线程让位

可以通过调用yield来使当前线程结束CPU占用,进入就绪态。

线程插入

在一个线程中,插入一个线程,可以使用join方法,如下列代码:

public class join方法 {
	public static void main(String[] args) {
		Thread th=new Thread(new Run2());
		th.start();
		try {
			th.join();
		} catch (InterruptedException e) {
			e.printStackTrace();
		}
		for(int i=0;i<1000;i++) 
			System.out.println("main");
	}
}

class Run3 implements Runnable{
	public void run() {
		for(int i=0;i<1000;i++) 
			System.out.println("Thread2");
	}
}

以上代码中,在主线程插入了线程th,当th执行结束后,才会继续执行后面的代码。即输入1000次Thread2后才能开始输出main。
注意:join方法执行后,th线程的栈内存依然存在。

线程安全(重点)

线程安全总结.

守护线程

java中的线程分为两类:用户线程、守护线程(后台线程)
具有代表性的守护线程是:垃圾回收线程。

守护线程的特点:一般守护线程是一个死循环,所有用户线程结束,守护线程就自动结束。

注意:主线程main方法是一个用户线程。

实现线程的第三种方式

FutureTask方式,实现 callable接口(JDK8新特性),这种方式可以获得线程的返回值。 而继承Thread和实现接口无法获取返回值,因为run方法返回值为void。
如下列代码:

public static void main(String[] args) throws InterruptedException, ExecutionException {
		FutureTask f=new FutureTask(new Callable() {
			public Object call() throws Exception {
				System.out.println("call method begin");
				Thread.sleep(1000*5);
				System.out.println("call method end");
				int a=5,b=10;
				return a+b;
			}
		});
		Thread t=new Thread(f);
		t.start();
		
		//get方法会导致当前线程的阻塞
		Object o=f.get();
		System.out.println(o);//输出结果为15
	}

这种方法有一个缺点:使用get方法会导致当前线程阻塞,要直到线程t结束才能继续执行。

Object类中的wait方法和notify方法(生产者和消费者模式)

wait和notify方法是java中任何一个对象都有的方法,因为这两个方法是object类中自带的

wait和notify方法的用法:
Object o=new Object();
o.wait();//表示让当前线程停下(使用对象o的线程停下)
o.notify();//表示让使用对象o的线程继续执行

还有一个notifyAll方法:表示唤醒所有使用o的线程

java模拟生产者消费者模式:
生产者消费者模式

以下是对提供的参考资料的总结,按照要求结构化多个要点分条输出: 4G/5G无线网络优化与网规案例分析: NSA站点下终端掉4G问题:部分用户反馈NSA终端频繁掉4G,主要因终端主动发起SCGfail导致。分析显示,在信号较好的环境下,终端可能因节能、过热保护等原因主动释放连接。解决方案建议终端侧进行分析处理,尝试关闭节电开关等。 RSSI算法识别天馈遮挡:通过计算RSSI平均值及差值识别天馈遮挡,差值大于3dB则认定有遮挡。不同设备分组规则不同,如64T和32T。此方法可有效帮助现场人员识别因环境变化引起的网络问题。 5G 160M组网小区CA不生效:某5G站点开启100M+60M CA功能后,测试发现UE无法正常使用CA功能。问题原因在于CA频点集标识配置错误,修正后测试正常。 5G网络优化与策略: CCE映射方式优化:针对诺基亚站点覆盖农村区域,通过优化CCE资源映射方式(交织、非交织),提升RRC连接建立成功率和无线接通率。非交织方式相比交织方式有显著提升。 5G AAU两扇区组网:与三扇区组网相比,AAU两扇区组网在RSRP、SINR、下载速率和上传速率上表现不同,需根据具体场景选择适合的组网方式。 5G语音解决方案:包括沿用4G语音解决方案、EPS Fallback方案和VoNR方案。不同方案适用于不同的5G组网策略,如NSA和SA,并影响语音连续性和网络覆盖。 4G网络优化与资源利用: 4G室分设备利旧:面对4G网络投资压减与资源需求矛盾,提出利旧多维度调优策略,包括资源整合、统筹调配既有资源,以满足新增需求和提质增效。 宏站RRU设备1托N射灯:针对5G深度覆盖需求,研究使用宏站AAU结合1托N射灯方案,快速便捷地开通5G站点,提升深度覆盖能力。 基站与流程管理: 爱立信LTE基站邻区添加流程:未提供具体内容,但通常涉及邻区规划、参数配置、测试验证等步骤,以确保基站间顺畅切换和覆盖连续性。 网络规划与策略: 新高铁跨海大桥覆盖方案试点:虽未提供详细内容,但可推测涉及高铁跨海大桥区域的4G/5G网络覆盖规划,需考虑信号穿透、移动性管理、网络容量等因素。 总结: 提供的参考资料涵盖了4G/5G无线网络优化、网规案例分析、网络优化策略、资源利用、基站管理等多个方面。 通过具体案例分析,展示了无线网络优化中的常见问题及解决方案,如NSA终端掉4G、RSSI识别天馈遮挡、CA不生效等。 强调了5G网络优化与策略的重要性,包括CCE映射方式优化、5G语音解决方案、AAU扇区组网选择等。 提出了4G网络优化与资源利用的策略,如室分设备利旧、宏站RRU设备1托N射灯等。 基站与流程管理方面,提到了爱立信LTE基站邻区添加流程,但未给出具体细节。 新高铁跨海大桥覆盖方案试点展示了特殊场景下的网络规划需求。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值