栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

Java

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

Java

线程
进程和线程的关系?
进程是系统运行程序的基本单位。而线程则是比进程更小的执行单位,一个进程的执行会产生多个线程。

并行和并发的区别?
并行是指多核CPU中,两个任务同时进行。
并发是指单核CPU中,两个任务都请求运行,只能接收一个任务,时间片分配问题,两个任务轮流进行。

调度方式?
时间片轮转:所有线程轮流使用 CPU 的使用权,平均分配每个线程占用 CPU 的时间。
抢占式调度:系统会让优先级高的线程优先使用 CPU(提高抢占到的概率),但是如果线程的优先级相同,那么会随机选择一个线程获取当前CPU的时间片。

使用java命令来运行一个类的时候,首先会启动jvm(进程),jvm会在创建一个名字叫做main的线程,来执行类中的程序入口(main方法)。

main线程在执行main方法的过程中,创建并启动了t线程,并且t线程启动后,和main线程就没有关系了,这时候main线程和t线程都是自己独立的运行,并且他们俩个是要争夺CUP的时间片(使用权)的。

 

线程的创建方式?
1.继承Thread类,通过匿名内部类重写run方法:单继承。
2.实现Runnable接口,重写run方法:
Runnable接口中只有一个run方法,线程对象和任务分离,同一个任务可以给不同的线程对象,多继承。
3.线程池:Java线程池的使用是为了防止内存溢出。同时线程池减少了创建和销毁线程的次数,每个工作线程都可以被重复利用,可以执行多个任务。
4.Callable接口:重写call方法,由返回值。

实现Runnable接口比继承Thread类所具有的优势:

  1. 可以把相同的一个执行任务(Runnable接口的实现),交给不同的线程对象去执行。
  2. 可以避免java中的单继承的局限性。
  3. 线程和执行代码各自独立,实现代码解耦。

Thread.currentThread(); 可以写在任意方法中,返回就是执行这个方法的线程对象。然后调用线程对象的getName方法,获取线程对象的名字:String name=Thread.currentThread().getName()。

默认情况下,主线程中,创建出的线程,它们的都会有一个默认的名字:“Thread-”+nextThreadNum()就是在拼接出这个线程默认的名字,Thread-0 Thread-1 Thread-2等等。

前台线程和后台线程?
前台线程也叫用户线程,运行在前台,执行具体的任务,eg:main线程,连接网络的子线程都属于用户线程。
后台线程也叫守护线程,运行在后台,为前台线程服务。只要用户线程全部执行结束,守护线程就会跟随jvm一起结束,eg:数据库连接池中的检测线程,jvm启动后的检测线程,垃圾回收线程。

线程的启动?
strat方法和run方法的区别?
1.start方法:Thread类中的方法,使线程由新建状态变为就绪状态,如果该线程已经是就绪状态,则产生IllegalStateException异常。
2.run方法:Runnable接口中的方法,线程应执行的任务。
直接调用run方法,只会执行同一个线程中的任务,而不会启动新线程。调用Thread的start方法,就会创建一个执行run方法的新线程。

线程的优先级?
优先级范围是1~10,默认是5。优先级高只是抢到时间片的概率变大,不一定能抢到。

Java中使用 java.lang.ThreadGroup 类来表示线程组。

//ThreadGroup线程组的构造器
public ThreadGroup(String name){
	//..
}
public ThreadGroup(ThreadGroup parent, String name){
	//..
}
//返回当前线程组中还没有“死亡”的线程个数
System.out.println("线程组中还在存活的线程个数为:"+group.activeCount());
//准备好数组,保存线程组中还存活的线程
Thread[] arr = new Thread[group.activeCount()];
//将存活的线程集中存放到指定数组中,并返回本次存放到数组的存活线程个数
System.out.println("arr数组中存放的线程个数为:"+group.enumerate(arr));
//输出数组中的内容
System.out.println("arr数组中的内容为:"+Arrays.toString(arr));

线程状态?
java.lang.Thread.State 枚举类型中(内部类形式),定义了线程的几种状态: NEW新建状态,RUNNABLE可运行状态,RUNNING运行状态,BLOCKED死亡状态,WAITING无限等待状态,TIMED_WAITING有限等待状态,TREMINATED死亡状态。

------------------
NEW

--start()-->RUNNABLE--线程调度(拿到时间片->;时间片用完,调用线程的yield()<-)-->RUNNING--run()方法结束,main线程结束,异常退出程序-->

TREMINATED
------------------
RUNNING

--sleep(有参),其他线程调用join()方法(有参join->无限等待状态WAITING,无参join->有限等待状态TIMED_WAITING)-->

--sleep执行结束,有参join指定的时间结束,interrupt()方法打断线程-->

RUNNABLE
------------------
RUNNING

--synchronized锁不可用-->

BLOCKED锁池队列,拿不到锁,锁阻塞

--拿到对象的锁-->

RUNNABLE
------------------
RUNNING

--wait方法只能由锁对象在同步代码块中调用-->

WAITING等待池,等待被唤醒

--notify(),notifyAll();interrupt()-->

BLOCKED锁池,锁阻塞拿不到锁
------------------

线程状态:官方6种–>理解成7种:可运行状态–>就绪-运行。
新建状态NEW
就绪状态RUNNABLE
运行状态RUNNING
死亡状态TERMINATED
3种阻塞状态:有限等待状态TIMED_WAITING、无限等待状态WAITING、锁阻塞状态BLOCKED

interrupt,interrupted,isInterrupt三者的区别?
(1)interrupt:只能由其他线程调用这个方法,打断这个线程,调用interrupt0(不是java语言实现的),设置打断标识,默认是false。
(2)isInterrupted:也是其他语言实现的,是否清除interrupt标识,默认false不清除。
(3)interrupted:静态方法,调用的是isInterrupted方法,但传的是true,清除标识。

notify和notifyAll的区别?
锁对象.notify(),该方法可以在等待池中,随机唤醒一个等待指定锁对象的线程,使得这个线程进入到锁池中,而进入到锁池的线程, 一旦发现锁可用,就可以自动恢复到RUNNABLE状态。
锁对象.notifyAll(),该方法可以在等待池中,唤醒所有等待指定锁对象的线程。

//waitAPI: 
synchronized (obj) {
	while ()
		obj.wait();
		... // Perform action appropriate to condition
} 

Thread:sleep,interrupt,join
Object:notify,notifyAll,wait(只有该对象作为锁对象,且在同步代码块中才能调用)

如何实现交替执行?
notify()+wait(),join()。
(1)notify()+wait():
notify叫醒的是等待池中在等待锁对象的线程,wait是让当前用完锁的线程进入等待池,用完锁的释放锁进入池,并且释放前通知了其他在池里等锁的。
(2)其他线程的run方法中调用某个线程的join方法,有参或无参,类似于插队执行。效果就是进入第1种阻塞状态,有限等待或无限等待。

JVM内存中的堆区,是一个共享的区域,是所有线程都可以访问的内存空间。
JVM内存中的栈区,是线程的私有空间,每个线程都有自己的栈区,别的线程无法访问到自己栈区的数据。

如果有多个线程,它们在一段时间内,并发访问堆区中的同一个变量,并且有写入的操作,那么最终可能会出数据的结果和预期不符的情况,这种情况就是线程安全问题。

Java中提供了线程同步的机制来解决线程安全问题。
Java中实现线程同步的方式,是给需要同步的代码进行 synchronized 关键字加锁。

synchronized关键字修饰非静态方法,默认使用this当做锁对象,并且不能自己另外指定。synchronized关键字修饰静态方法,默认使用 当前类的Class对象 当做锁对象,并且不能自己另外指定。

线程同步的效果的关键点在于,让t1和t2俩个线程去争夺同一把锁对象。

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/274743.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号