linux 多线程面试题_linux 线程 pthread_create_linux进程线程

电脑杂谈  发布时间:2019-07-19 11:09:22  来源:网络整理

linux进程线程_linux 多线程面试题_linux 线程 pthread_create

多线程面试题:

1.什么是线程,什么是进程,它们有什么区别和联系,一个进程里面是否必须有个线程

(先讲进程)

答案

Icon

进程本质上是一个执行的程序,一个进程可以有多个线程。它允许计算机同时运行两个或多个程序。一个进程至少会有一个线程。线程是进程的最小执行单位。

区别:多进程程序不受Java的控制,而多线程则受Java控制。多线程比多进程需要更少的管理费用。

2.实现一个线程有哪几种方式,各有什么优缺点,比较常用的是那种,为什么

答案

Icon

线程有3种实现方式:

①.通过继承Thread类,优点:可以直接调用start方法启动。缺点:继承一个类后,不能再继承别的类。需要重写run方法。无返回值。

1.5中,只能用于在继承某个类时,重写父类中的方法,而在实现一个接口中的方法时,是不能使用该注解的,从1.6开始,才支持实现父接口的方法使用该注解。两种方法各有所长,jdk代理需要先设置一个接口,然后才能实现代理,这是它的缺点,也是它的优点,缺点是这样会麻烦一点,而且无法对那些已经封装好的,没有实现接口的类进行代理,而cglib代理的方式不需要使用接口。//allocates a new thread object. 其中runnable接口、name属性、threadgroup、stacksize会选择性搭配,作为其构造参数,在最上面的思维导图可见,新建线程的方式一般分为两种:1.继承thread类,2.实现runnable接口。

③.实现Callable接口,优点:可以抛出异常,有返回值;缺点:只有jkd1.5以后才支持。需要重写call方法。结合FutureTask和Thread类一起使用,最后调用start启动。

一般最常用的是第二种,实现Runnable接口。比较方便,可扩展性高。

3. 一般情况下我们实现自己线程时候要重写什么方法

答案

Icon

使用Thread类,要重写run方法,或实现Runnable接口时,要实现run()方法

使用Callable接口时,要重写call方法,且有返回值。

4.start方法和run方法有什么区别,我们一般调用的那个方法,系统调用的是那个方法

答案

Icon

start用于启动线程,当调用start后,线程并不会马上运行,而是处于就绪状态,是否要运行取决于cpu给的时间片。

run用于子类重写来实现线程的功能。

我们一般调用的是start方法,系统调用的是run方法。

5.sleep方法有什么作用,一般用来做什么

答案

Icon

sleep是一个Thread类的静态方法,让调用它的线程休眠指定的时间,可用于暂停线程,但不会把锁让给其他线程,时间一到,线程会继续执行。

6. 讲下join,yield方法的作用,以及什么场合用它们

答案

Icon

join线程有严格的先后顺序,调用它的线程需要执行完以后其他线程才会跟着执行。

yield是暂停当前正在执行的线程对象,把时间让给其他线程。

使用场合:join线程有严格的先后顺序,yield当前线程占用cpu使用率很高时,把时间让出来。(死循环时)

7.线程中断是否能直接调用stop,为什么?

答案

Icon

不可以,stop方法是从外部强行终止一个线程,会导致不可预知的错误。如使用IO流时不能关流

8.列举出一般情况下线程中断的几种方式,并说明他们之间的优缺点,并且说明那种中断方式最好

答案

Icon

中断线程有4种方式:

linux进程线程_linux 多线程面试题_linux 线程 pthread_create

①.由interrupt发出中断信号,用户接收中断信号,通过isInterrupted判断线程是否中断。

②.由interrupt发出中断信号,系统接收中断信号,通过sleep抛出中断异常,并把中断信号清除,只能抛出一次。

③.用户自定义中断信号,并将该信号发出,自己接收该中断信号。

④.调用interrupted(),会把中断信号清除,并中断线程。

9.线程有几种状态,他们是怎么转化的

答案

Icon

线程一般分为:新生、可运行、运行、阻塞、死亡五种状态。

当创建一个线程后,并没有运行,还处于新生状态,需要通过调用start方法,让线程处于可运行状态,但是否运行取决cpu分配的时间片,当得到cpu的时间片后,线程就会马上运行,一个正在执行的线程可以通过很多方式进入阻塞状态(等待输入/输出 ,sleep,wait,get)当执行完所有操作后就进入死亡状态。

10.在实现Runnable的接口中怎么样访问当前线程对象,比如拿到当前线程的名字

答案

Icon

通过currentThread()方法访问当前线程对象,通过getName()可获得当前线程的名字。

11. 讲下什么是守护线程,以及在什么场合来使用它

答案

Icon

守护线程一般在后台提供通用性支持,只有非守护线程全部退出时,守护线程才会退出。

当主线程和主线程创建的子线程全部退出,守护线程一定会跟着退出。

在这个线程函数中可以可以通过设置mt_interval来控制这个线程的函数体多久执行一次,当事件为无信号状态时函数体隔mt_interval执行一次,当设置事件为有信号状态时,线程就执行完毕了(return 0)。在这个线程函数中可以通过设置mt_interval来控制这个线程的函数体多久执行一次,当事件为无信号状态时函数体隔mt_interval执行一次,当设置事件为有信号状态时,线程就执行完毕了。如果任意一个线程调用了exit或_exit,则整个进程的所有线程都终止,由于从main函数return也相当于调用exit,为了防止新创建的线程还没有得到执行就终止,我们在main函数return之前延时1秒,这只是一种权宜之计,即使主线程等待1秒,内核也不一定会调度新创建的线程执行,1.2我们会看到更好的办法。

答案

Icon

线程的优先级就是设置哪个线程优先执行,但也不是绝对的,只是让优先级高的线程优先运行的几率高一些。线程默认是NORM_PRIORITY = 5; 设置优先级使用的是setPriority()函数。

13.为什么Thread里面的大部分方法都是final的

答案

Icon

不能被重写,线程的很多方法都是由系统调用的,不能通过子类覆写去改变他们的行为。

14.什么是线程同步,什么是线程安全

答案

Icon

当两个或两个以上的线程需要共享资源,他们就需要某种方法来确定资源在某一刻仅被一个线程占用。

线程安全就是多线程操作同一个对象不会有问题,线程同步一般来保护线程安全,final修饰的也是线程安全

15.讲下同步方法和同步块的区别,以及什么时候用它们

答案

Icon

同步方法就是被synchronized修饰的方法,同步整个方法,且整个方法都会被锁住,同一时间只有一个线程可以访问该方法。整个业务,缺点:性能差

同步块就是使用synchronized修饰的代码块,可以同步一小部分代码

同步块越小性能越好,当性能要求比较高时,用同步块

16.简单说下Lock对象的实现类的锁机制和同步方法或同步块有什么区别

答案

Icon

答:可重入锁是jdk1.5以后出现的,比同步方法或同步块更加灵活,可以控制在什么时候上锁,什么时候解锁,而使用同步块或同步方法后,必须要等代码执行完后才会解锁。

17. 同步块里面的同步监视器是怎么写的,默认的同步方法里面的同步监视器是那个

答案

Icon

linux进程线程_linux 线程 pthread_create_linux 多线程面试题

synchronized(对象){

//代码块

}

默认的同步监视器this

18.讲下什么 是死锁,死锁发生的几个条件是什么

答案

Icon

死锁就是当有两个或两个以上的线程都获得对方的资源,但彼此有不肯放开,处于僵持状态,此时便造成了死锁。

条件:两个或两个以上的线程

同时想要获取对方的资源,彼此又不肯放开

19.线程间是什么通信的,通过调用几个方法来交互的

答案

Icon

一、wait方法:导致当前线程进入等待,直到其他线程调用该同步监视器的notify方法或notifyall方法来唤醒该线程。1、wait方法:导致当前线程进入等待,直到其他线程调用该同步监视器的notify方法或notifyall方法来唤醒该线程。而调用notify()方法可以唤醒等待队列中第一个等待同一共享资源的线程,并使该线程退出等待队列,进入可运行态。

20.wait,notify,notifyAll在什么地方使用才有效,他们是那个类的方法

答案

Icon

wait ,notify , notifyAll都必须在synchronized修饰的方法或synchronized块中使用,都属于Object的方法,可以被所有类继承,都是final修饰的方法,不能通过子类覆写去改变他们的行为。

21.wait和sleep有什么区别和联系,他们执行的时候是否都会释放锁

答案

Icon

非繁忙等待:如果一个线程已经锁定了一个互斥量,第二个线程又试图去锁定这个互斥量,则第二个线程将被挂起(不占用任何cpu资源),直到第一个线程解除对这个互斥量的锁定为止,第二个线程则被唤醒并继续执行,同时锁定这个互斥量。nscondition可以让那些已经锁定nscondition对象却无法继续执行的线程释放nscondition对象,nscondition对象也可以唤醒其他处于等待状态的线程。除此之外,nscondition可以让那些已经锁定nscondition对象却无法继续执行的线程释放nscondition对象,nscondition对象也可以唤醒其他处于等待状态的线程。

22.yield,sleep方法有什么区别和联系

答案

Icon

yield和sleep都是可以让线程暂停,但yield会暂停当前正在执行的线程,把时间片让给其他线程,而sleep虽然也是暂停当前线程,但只会暂停指定的时间,不会把同步锁让给其他线程,时间到了当前线程还会继续执行。

sleep()和wait()的区别。

Icon

wait和sleep都可以使线程暂停,但wait必须在synchronized修饰的方法或synchronized块中使用,wait可以使锁定解除,而sleep不会解锁,wait不被唤醒是一直会在等待,而sleep会在休眠时间结束之后便会执行

线程的启动是哪个方法,调用的是哪个方法?

Icon

start用于启动线程,当调用start后,线程并不会马上运行,而是处于就绪状态,是否要运行取决于cpu给的时间片。

run用于子类重写来实现线程的功能。

我们一般调用的是start方法,系统调用的

是run方法。

线程安全与线程不安全的区别

Icon

当两个或两个以上的线程需要共享资源,他们就需要某种方法来确定资源在某一刻仅被一个线程占用。

线程安全就是多线程操作同一个对象不会有问题,线程同步一般来保护线程安全,final修饰的也是线程安全

线程的实现方式,线程的生命周期等

Icon

1.线程的生命周期线程是一个动态执行的过程,它也有一个从产生到死亡的过程。

(1)生命周期的五种状态

新建(new Thread)当创建Thread类的一个实例(对象)时,此线程进入新建状态(未被启动)。

linux 多线程面试题_linux进程线程_linux 线程 pthread_create

例如:Thread t1=new Thread();

当第一次运行生产现场时调用生产的方法,此时有一只烤鸭,即flag=false,无需等待,因此我们设置可消费的烤鸭名称然后改变flag=true,同时通知消费线程可以消费烤鸭了,即使此时生产线程再次抢到执行权,因为flag=true,所以生产线程会进入等待阻塞状态,消费线程被唤醒后就进入消费方法,消费完成后,又改变标志flag=false,通知生产线程可以生产烤鸭了.........以此循环。 } } } public void consume() // 消费 { lock (monitor) { while (true) { // 通知等待队列中的线程锁定对象状态的更改,但不会释放锁 // 接收到 pulse 脉冲后,线程从同步对象的等待队列移动到就绪队列中 // 注意:最终能获得锁的线程并不一定是得到 pulse 脉冲的线程 monitor.pulse(monitor)。此时点击“创建图片”后会执行createimagename方法,这是一个生产者,它会创建一个图片链接放到imagenames中,然后通过调用nscondition的signal方法就会在条件等待队列中选择一个线程(该线程会任意选取,假设为线程a)开启,那么此时这个线程就会继续执行。


本文来自电脑杂谈,转载请注明本文网址:
https://www.pc-fly.com/a/jisuanjixue/article-114186-1.html

相关阅读
    发表评论  请自觉遵守互联网相关的政策法规,严禁发布、暴力、反动的言论

    热点图片
    拼命载入中...