线程---基本概念

线程---基本概念

1.什么是线程组,为什么不推荐使用?线程池和线程组的区别是什么?

 

线程组就是为了管理线程而创建的线程的集合,线程组中可以包含其他的线程组。它可以表示为一棵树,每一个线程组都有其父线程组。

它的特点就是:允许线程访问其所属线程组的资源,但不允许访问其父线程组和其它线程组。

 

不推荐使用的原因就是为了节省线程创建和销毁所花费的开支,从而提高系统性能。

 

线程的状态从大的方面来说有三个:创建 运行 销毁。

因为线程的运行时间是有效时间,因为只有在这段时间线程在执行任务,所以对于线程的优化来说我们只能从创建和销毁来入手,因此就产生了线程池的概念,它的作用原理就是,事先创建一定量的线程,当任务来的时候去执行任务,当不需要线程的时候就销毁,这样就避免了频繁的销毁操作,从而节省时间优化程序。

 

2.在线程当中怎么处理捕捉到的异常?

一种就是将错误捕捉到向上抛

另一种就是将其写入到错误日志。

 

3.java中的线程调度,调度策略?

线程调度就是为线程分配时间片的一种方法。

Java中的多线程并发实际上就是每一个线程轮流使用CPU来执行自己的方法,但是并不能保证每个线程得到的时间片是相同的。

Java中采用的模型就是抢占式调度模型,也即谁的优先级高谁就得到CPU,当优先级相同的时候,会随机选择一个线程来运行。

如果希望一个线程可以优先运行可以调整它的优先级用yield()方法

使得java线程放弃cpu的方法主要有三个:

       一就是这个线程以及运行完毕了

二就是它的时间片用完了,会被剥夺cpu的使用全

三就是被方法阻塞了,如sleep()  join() 二进入阻塞状态

注意的就是,java线程的调度并不是跨平台的。

 

4.什么是活锁,死锁,饥饿

三个词:活锁谦让   死锁占据  饥饿总是不幸的得不到CPU

解决方案:活锁先来先服务  死锁同步机制  饥设置时间缺省值

死锁发生的条件:资源互斥、请求和保持条件、不可剥夺条件、环路等待条件

 

5.什么是线程的上下文,什么时候会发生上下文的切换?

线程的上下文是指:当系统重新启动一个线程或者开启一个新的进程的,使之进入活动状态时,产生的信息叫做上下文,这些信息中记录是当前线程的状态。

当一个线程被移除内核,并使另一个线程活动,也即在发生先线程的抢占的时候会发生上下文的切换。

 

6.线程和进程的区别;

 

首先,进程是系统进行资源调配的执行单位,它是某个具有独立功能的程序在某个数据集合上的一次活动。

线程是进程的一个实体,是系统进行资源调配的分派的基本单位。

进程和线程的主要差别在于它们是不同的操作系统资源管理方式

       1)在地址和资源上:同一个进程内的线程共享所在进程的资源和地址空间,进程拥有自己的独立空间,而线程是共享但是每个独立的线程有一个程序运行的入口、顺序执行序列和程序的出口。线程不能够独立执行,必须依存在应用程序中,由应用程序提供多个线程执行控制。,在此基础之上进程对统一的资源进行调度分派;

2)线程是处理器调度的基本单位,但是进程不是;

3) 一个程序至少有一个进程,一个进程至少有一个线程. 从而线程的划分尺度小于进程,使得多线程程序的并发性高。

优缺点:

线程执行开销小,但不利于资源的管理和保护;

而进程正相反。

同时,线程适合于在SMP机器上运行,而进程则可以跨机器迁移。

7.java中绿色线程和本地线程的区别?

绿色线程指的是用户级别的线程,且一次使用一个OS线程,而本地线程使用的是线程系统,每一个java线程是一个OS线程。同时在执行java程序的时候我们可以使用-green -native来表示这两种线程。

 

8.多线程并发执行的时候常遇见的问题?怎么解决?

一般遇见的问题有:竞争条件,死锁,活锁,饥饿;

1)首先竞争条件是多个线程同时访问一个资源,而资源的结果状态不明确这就是竞争条件;

当程序员确定某个地方要使用同步而又忘记使用的时候 怎会产生竞争条件;

解决的办法就是上锁:

       上锁有两种方式一种是使用同步的对象锁或者类锁以及同步代码块;

另一种就是使用lock() unlock()组合锁来实现同步

2)死锁

死锁是当两个线程之间都需要对方此时占有的资源时产生的一种阻塞状态;它多是使用Syncronized造成的;

解决的方式主要是对都要访问的资源设置一个访问顺序,让线程依次访问

还有就是不要锁资源而是锁对象也是可以的;

 

3)活锁

活锁是由于线程之间的谦让造成的;

解决的办法就是:采用先来先服务的机制来控制资源的访问

4)饥饿

饥饿时由于一个线程在等待之后,再也没有的到CPU,很不幸;

解决的办法是采用公平锁,就是每一个想要锁目标资源的线程都会进入一个队列,每次解锁后又队列的第一个上锁,其它的继续等待。

 

8.CycliBarriar和countDownLatch有什么区别?

首先 countdownLattch指的是:一个线程(或者多个线程)等待,等待其它N个线程完成某个指定的事情之后,才能执行。

而CycliBarriar指的是:N个线程的事情,这N个线程在其中任何一个线程没有完成之前都不能继续。

它们之间的区别主要是:

countdownLatch注重的是一个线程的等待,而CycliBarriar则是N个线程的等待;

CycliBarriar可以使用多次,countdownLatch只能使用一次

Barriar是当指的阈值数量的线程达到的时候就可以继续了,而countdownLatch是指定事件达到某个状态的时候继续;

 

9.java中怎样唤醒阻塞的线程?

阻塞主要会有两种阻塞的情况:

第一种是IO阻塞,解决的第一张办法就是在创建线程的时为其设置一个阈值,当线程的数量到达规定的阈值的时候,就不再创建对象;第二种就是在创建对象的时候,设置一个标志变量来表示该线程状态;第三种就是创建后直接交又线程组去处理;

第二种就是以为方法的阻塞比如说waitsleep() join() 这种类型的阻塞解决的办法就是中断线程,抛出打断异常去唤醒。

 

10.为什么要调用Start()方法再去执行run()方法,而不是直接去执行run()方法?

当你调用start方法的时候系统会创建一个新的线程,执行run()方法而直接去调用run()方法即不会创建新的线程也不会执行方法里面调用线程的代码;

 

11.如何使用Thread dump,以及如何使用Thread dump来进行分析?

 

首先Thraead dump它是一种比较有效用来分析java应用问题的一种工具:

每一个jvm都有产生所有线程某一点的Threaddump的能力,虽然有时候输出信息的格式会有所不同,但都包含了线程,线程运行的状态,标记以及调用的堆栈,其中堆栈的信息包括的有全部的类名,调用的方法,有时也会显示代码的行数。

分析:之前的SE版本都是使用一些命令来调用这些信息,但是在SE6的时候提供了jconsole的图形化工具,在命令行中输入jconsole就可以打开界面在输如地址就可以查看你的线程运行的状态,比如说内存的占用,CPU的占用率,比如你可以看内存的占用如果这个程序的内存占用空间比较大而且一直是高升不下,那么这个线程就是有问题的应该及时的调整。

 

12.java中的volatile关键字作用是什么?怎么用?与Syncronized的区别是什么?

 

首先,volatile关键字是用来同步变量的。在java中线程访问某个变量的时候后将其拷贝一份这样做虽然说提高了执行的效率,但是不能保证拷贝的变量与原有变量的同步性,可能会产生一系列的问题。

而Volatile关键字就是用来避免这种问题的。当一个变量被volatile修饰的时候将相当于告诉jvm这个变量是不保留拷贝的,访问的时候直接访问主内存当中的值,这也就意味着这个变量可以随时被访问和修改的,从而保证了变量值不能及时同步的问题。

它和Syncronized之间的区别就是它不能取代Syncronized因为它不能保证造作的原子性。

 

13.如何实现java阻塞队列?

 

首先阻塞队列是,一个支持两个操作的队列,一个就是当队列为空的时候,说明没有存储元素,这时候获取元素的线程会等待队列变为非空,当非空的时候再去里面获取元素;另一个就是当队列是满时,说明没有线程获取线程获取数据,存储元素的线程会等待队列可用时再去存储。

阻塞队列通常用在生产者消费者问题上,生产者是存储元素的线程,消费者是获取原色的线程,而阻塞队列相当于一个容器,生产者向容器当中存储元素,而消费者只从里面获取元素。

 

14.java中wait()和sleep的区别?

1)当它两个作用时锁的状态是不同的,wait()会释放锁,而sleep()不会;

2)用处不同:wait()用于不同线程之间的切换,而sleep()通常用于停止执行某个线程一顿时间。

3)所用的范围不同:wait()notify() notifyAll()通常用在同步代码块或则同步方法当中,而sleep()通常那都可以使用。

4)二者所属的类不同:wait()是属于Object的 而sleep()是属于Thread的;

5)对于sleep()来说异常必须捕获。而对于wait() notify() notifyAll()来说是不需要捕获异常的。

 

15 .lock()锁相较于Syncronized来说优势在哪里?

Lock()最大的优势在于,它分别为读和写都提供了锁;

其中读锁允许多个读的进程同时静入但是不允许写程序进入,而写锁只允许一个写的线程进去不允许其它的线程进入;
版权声明:本文为博主原创文章,未经博主允许不得转载。

猜你喜欢

转载自blog.csdn.net/qq_42112846/article/details/80846627