速记基础知识【java线程高并发提升一】

1、什么是线程?

线程是操作系统能够进行运算调度的最小单位。它被包含在进程之中,是进程中的实际运作单位。一条线程指的是进程中一个单一顺序的控制流,一个进程中可以并发多个线程,每条线程并行执行不同的任务。在Unix
System V及SunOS中也被称为轻量进程(lightweight processes),但轻量进程更多指内核线程(kernel
thread),而把用户线程(user thread)称为线程。程序由线程构成。

2、什么是线程安全?

线程安全是:当一个类或者方法在不需要其他类或方法协同辅助时被任意调用,仍然能保持内部数据正确且逻辑正确,那这个类或方法是线程安全的。

3、什么类是线程安全的?

被final修饰的类、enum类、线程兼容类(使用synchronized控制同步的类)、java.util.concurrent下的类。

4、什么是线程的同步、异步?

同步

线程A调用线程B,只有当线程B处理完自身逻辑之后(此时线程A处于阻塞等待状态),才能返回给线程A。比如A向B发消息,B没回,A就只能等着,直到B发了消息。常见应用场景:搜索(任何搜索引擎比如百度,只有等处理完数据才能显示)、固定流水线流程(别人做完自己才能做)
转换如图:在这里插入图片描述

异步

线程A调用线程B,线程B立即返回给线程A某临时数据(比如接受成功提示),当线程B处理完逻辑之后(此时线程A处于运行状态),再将结果返回给线程A。比如A向B发消息,B发送本人繁忙消息,A就做其他事情。常见应用场景:任何耗时任务(比如用户下订单,在用户下完订单之后,先提示订单完成,之后提示其他有关订单的非必要信息)
转换如图:
在这里插入图片描述

二者对比

优势劣势
同步逻辑处理直观实时耗时长
异步节省时间,节省资源需要很多异步任务保证数据逻辑正确

5、什么是阻塞、非阻塞?

阻塞

同步时,线程A调用线程B,线程B未返回结果,此时线程A处于阻塞状态(等待中且对应线程被挂起)

非阻塞

异步时,线程A调用线程B,即便线程B未返回结果,线程A也在正常运行,此时线程A处于非阻塞状态(运行中且对应线程不挂起)

6、什么是并发、并行?

并发

并不一定是同时进行但表现出同时多个处理,比如百度网盘多个文件同时在下载但是实际是cpu分微小时间段进行单个处理。
如图:
在这里插入图片描述

并行

一定是同时进行也表现出同时多个处理,比如两个cpu同时在下载两个文件,那么这两个文件就处于并行状态。
如图:在这里插入图片描述

7、如何自定义创建线程?

(1)Runnable接口创建线程,逻辑如下。

package One_CreateThread;

public class creatThread {
	public static void main(String[] args) {
		Runnable runnable = new Runnable() {
			
			@Override
			public void run() {
				// TODO Auto-generated method stub
				System.out.println("测试线程开启");
			}
		};
		
		Thread thread = new Thread(runnable);
		thread.start();
	}
}

(2)继承Thread创建线程,逻辑如下。

public static void main(String[] args) {
		creat2();
	}
	static void creat2() {
		MyThread myThread = new MyThread();
		myThread.start();
	}
	public static class MyThread extends Thread{
		@Override
		public void run() {
			// TODO Auto-generated method stub
			System.out.println("测试线程开启");
		}
	}

(3)Callable和FutureTask(Runnable的子类对象)创建线程,逻辑如下。

    public static void main(String[] args) {
		creat3();
	}
	static void creat3(){
		Callable<String> caThread = new CaThread();
		FutureTask<String> futureTask = new FutureTask<>(caThread);
		//开启线程
		new Thread(futureTask).start();
		try {
			System.out.println(futureTask.get());
		} catch (InterruptedException | ExecutionException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
	}
	public static class CaThread implements Callable<String> {

		@Override
		public String call() throws Exception {
			// TODO Auto-generated method stub
			return "callable测试线程开启";
		}
		
	}

(4)实现runnable或者callable接口并注册到线程池执行,逻辑如下。

    public static void main(String[] args) {
		creat4();
	}
	static void creat4() {
		ExecutorService executorService = Executors.newFixedThreadPool(2);
		
		//runnable start
		Runnable runnable = new Runnable() {

			@Override
			public void run() {
				// TODO Auto-generated method stub
				System.out.println("runnable注册线程开启");
			}
		};
		//1.1 execute开启runnable
		executorService.execute(runnable);
		//1.2submit开启runnable
		Future<String> submit = (Future<String>) executorService.submit(runnable);
		try {
			System.out.println(submit.get());
		} catch (InterruptedException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (ExecutionException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		//2 submit开启callable
		Callthread callthread = new Callthread();
		Future<String> submit2 = executorService.submit(callthread);
		try {
			System.out.println(submit2.get());
		} catch (InterruptedException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (ExecutionException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
	}
	private static class Callthread implements Callable<String>{

		@Override
		public String call() throws Exception {
			// TODO Auto-generated method stub
			return "callable注册线程开启";
		}
		
	}

8、线程的六个状态及关联?

六种状态

NEW:线程创建但是还没有调用start()方法
RUNNABLE :可运行线程的状态,线程已经在JVM虚拟机中执行,但是可能需要等待操作系统资源,如处理器。RUNNABLE包括RUNNING和READY
BLOCKED :阻塞的线程意味着正在等待监视器锁,来进入或重入synchronized代码块或者方法
WAITING :等待状态,需要其他线程中断或通知来唤醒
TIMED_WAITING :定时等待状态,在指定等待时间后返回,或提前被其他线程中断或通知返回
TERMINATED :终止线程的线程状态,线程已执行完成
关联如图:
在这里插入图片描述
大致描述:

  1. 线程Anew之后变为运行态。
  2. 运行态通过上述命令可变为等待、超时等待、阻塞三种状态。三种状态也可变为运行态
  3. 运行态线程执行完成终止。

线程的java操作:

1.Thread.yield()
简言之,让步。比如线程A,B先后调用某资源。当某时刻A.yield,那么立即由B使用该资源,B执行完成后,A在继续执行。
2.Thread.sleep()
简言之:暂时睡眠。比如线程A,B先后调用某资源。当某时刻A.sleep,那么等A睡眠结束后完成该资源调用,B才能开始使用。
3.Thread.join()
简言之:立即加入。比如线程A,B先后调用某资源。当某时刻A.sleep,随后B.join()那么B立即开始使用该资源。等A睡眠结束后也只有B完成了,A才能继续使用该资源。
4.Object.wait()
简言之:等待。Object类的方法,调用前必须拥有对象锁,比如在synchronized代码块内,调用wait方法后,对象锁会释放,线程进入WAITING等待状态

9、什么是死锁?

网上百度为:

死锁是指两个或两个以上的进程在执行过程中,由于竞争资源或者由于彼此通信而造成的一种阻塞的现象,若无外力作用,它们都将无法推进下去。此时称系统处于死锁状态或系统产生了死锁,这些永远在互相等待的进程称为死锁进程

个人解释为:多线程抢占多个锁,抢占顺序不相同。那么A抢占到了资源锁a,想去抢占其他线程已占有的锁,抢占不到。而其他线程想抢占线程A所占有的锁也抢占不到。这样就出现了死锁。

10、如何处理死锁?

1.尝试获取超时释放的锁。比如lock的trylock来获取锁
2.发生程序锁时,重启程序。

下文链接:锁的智慧【java线程高并发提升二】

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

河南-殷志强

希望我的文章能帮助到你

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值