1、线程和进程的区别

进程是应用程序的执行实例。比如说,当你双击的Microsoft Word的图标,你就开始运行的Word的进程。线程是执行进程中的路径。另外,一个过程可以包含多个线程。启动Word时,操作系统创建一个进程并开始执行该进程的主线程。

由于一个进程可以由多个线程,线程可以被认为是“轻量级”的过程。因此,一个线程和一个进程之间的本质区别在于,每一个用来完成的工作。线程用于小任务,而进程用于更多的'重量级'的任务

2、实现线程有哪几种方式?

(1)继承Thread类实现多线程

(2)实现Runnable接口方式实现多线程

(3)使用ExecutorService、Callable、Future实现有返回结果的多线程(不常用)

3、线程有哪几种状态?它们之间如何流转的?

(1)新建状态

(2)就绪状态

(3)运行状态

(4)阻塞状态

(5)死亡状态

4、线程中的start()和run()方法有什么区别

run()方法:在本线程内调用该Runnable对象的run()方法,可以重复多次调用;
start()方法:启动一个线程,调用该Runnable对象的run()方法,不能多次启动一个线程

5、怎么终止一个线程?如何优雅地终止线程?

(1) 使用退出标志,使线程正常退出,也就是当run方法完成后线程终止。

(2)  使用stop方法强行终止线程(这个方法不推荐使用,因为stop和suspend、resume一样,也可能发生不可预料的结果)。

(3)  使用interrupt方法中断线程。

6、ThreadLocal在多线程中扮演什么角色?

  解决多线程程序的并发问题提供了一种新的思路 

7、线程中的wait()和sleep()方法有什么区别?

sleep与wait最主要的区别在于,sleep与wait都可以使线程等待,但sleep不会释放资源而wait会释放资源。

还有就是,wait方法只能在同步块或者同步方法中执行。

8、多线程同步有哪几种方法?

1.同步方法

代码如:
public synchronized void save(){}

2.同步代码块

代码如:
synchronized(object){
}

3.使用特殊域变量(volatile)实现线程同步

class Bank {
//需要同步的变量加上volatile
private volatile int account = 100; public int getAccount() {
return account;
}
//这里不再需要synchronized
public void save(int money) {
account += money;
}

9、什么是死锁?如何避免死锁?

所谓死锁:是指两个或两个以上的进程在执行过程中,因争夺资源而造成的一种互相等待的现象,若无外力作用,它们都将无法推进下去。此时称系统处于死锁状态或系统产生了死锁,这些永远在互相等待的进程称为死锁进程。由于资源占用是互斥的,当某个进程提出申请资源后,使得有关进程在无外力协助下,永远分配不到必需的资源而无法继续运行,这就产生了一种特殊现象死锁。

虽然进程在运行过程中,可能发生死锁,但死锁的发生也必须具备一定的条件,死锁的发生必须具备以下四个必要条件。

1)互斥条件:指进程对所分配到的资源进行排它性使用,即在一段时间内某资源只由一个进程占用。如果此时还有其它进程请求资源,则请求者只能等待,直至占有资源的进程用毕释放。

2)请求和保持条件:指进程已经保持至少一个资源,但又提出了新的资源请求,而该资源已被其它进程占有,此时请求进程阻塞,但又对自己已获得的其它资源保持不放。

3)不剥夺条件:指进程已获得的资源,在未使用完之前,不能被剥夺,只能在使用完时由自己释放。

4)环路等待条件:指在发生死锁时,必然存在一个进程——资源的环形链,即进程集合{P0,P1,P2,···,Pn}中的P0正在等待一个P1占用的资源;P1正在等待P2占用的资源,……,Pn正在等待已被P0占用的资源。

在系统中已经出现死锁后,应该及时检测到死锁的发生,并采取适当的措施来解除死锁。目前处理死锁的方法可归结为以下四种:

1) 预防死锁。

  这是一种较简单和直观的事先预防的方法。方法是通过设置某些限制条件,去破坏产生死锁的四个必要条件中的一个或者几个,来预防发生死锁。预防死锁是一种较易实现的方法,已被广泛使用。但是由于所施加的限制条件往往太严格,可能会导致系统资源利用率和系统吞吐量降低。

2) 避免死锁。

  该方法同样是属于事先预防的策略,但它并不须事先采取各种限制措施去破坏产生死锁的的四个必要条件,而是在资源的动态分配过程中,用某种方法去防止系统进入不安全状态,从而避免发生死锁。

3)检测死锁。

  这种方法并不须事先采取任何限制性措施,也不必检查系统是否已经进入不安全区,此方法允许系统在运行过程中发生死锁。但可通过系统所设置的检测机构,及时地检测出死锁的发生,并精确地确定与死锁有关的进程和资源,然后采取适当措施,从系统中将已发生的死锁清除掉。

4)解除死锁。

  这是与检测死锁相配套的一种措施。当检测到系统中已发生死锁时,须将进程从死锁状态中解脱出来。常用的实施方法是撤销或挂起一些进程,以便回收一些资源,再将这些资源分配给已处于阻塞状态的进程,使之转为就绪状态,以继续运行。死锁的检测和解除措施,有可能使系统获得较好的资源利用率和吞吐量,但在实现上难度也最大。

10、多线程之间如何进行通信?

https://www.cnblogs.com/hapjin/p/5492619.html

11、线程怎样返回结果?如何获取?

回调函数:https://www.cnblogs.com/FlyHeLanMan/p/6956880.html

轮询

12、说说violatile关键字有什么用,和Synchronized有什么区别?

      volatile本质是在告诉jvm当前变量在寄存器中的值是不确定的,需要从主存中读取,synchronized则是锁定当前变量,只有当前线程可以访问该变量,其他线程被阻塞住.
      volatile仅能使用在变量级别,synchronized则可以使用在变量,方法.
      volatile仅能实现变量的修改可见性,但不具备原子特性,而synchronized则可以保证变量的修改可见性和原子性.
      volatile不会造成线程的阻塞,而synchronized可能会造成线程的阻塞.
      volatile标记的变量不会被编译器优化,而synchronized标记的变量可以被编译器优化.

13、假如新建T1、T2、T3三个线程,如何保证它们按顺序执行?

T3先执行,在T3的run中,调用t2.join,让t2执行完成后再执行t3

在T2的run中,调用t1.join,让t1执行完成后再让T2执行

public class JoinTest2 {  

    // 1.现在有T1、T2、T3三个线程,你怎样保证T2在T1执行完后执行,T3在T2执行完后执行  

    public static void main(String[] args) {  

        final Thread t1 = new Thread(new Runnable() {  

            @Override
public void run() {
System.out.println("t1");
}
});
final Thread t2 = new Thread(new Runnable() { @Override
public void run() {
try {
//引用t1线程,等待t1线程执行完
t1.join();
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("t2");
}
});
Thread t3 = new Thread(new Runnable() { @Override
public void run() {
try {
//引用t2线程,等待t2线程执行完
t2.join();
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("t3");
}
});
t3.start();
t2.start();
t1.start();
}
}

14、怎么控制同一时间只有3个线程运行?

15、为什么要使用线程池?

线程的执行过程:

创建(t1)  运行(t2) 销毁(t3)

线程运行的总时间 T= t1+t2+t3;

假如,有些业务逻辑需要频繁的使用线程执行某些简单的任务,那么很多时间都会浪费t1和t3上。

为了避免这种问题,JAVA提供了线程池

在线程池中的线程可以复用,当线程运行完任务之后,不被销毁

16、说一说常用的几种线程池并讲讲其中的工作原理。

17、线程池启动线程submit()和execute()有什么不同?

18、说说多线程并发控制中的倒计时器、循环栅栏是什么,有什么应用场景?

19、什么是活锁、饥饿、无锁、死锁?

20、什么是原子性、可见性、有序性?

21、什么是守护线程?有什么用?

22、怎么中断一个线程?如何保证中断业务不影响?

23、yield()方法有什么用?

24、什么是重入锁,和Synchronized锁有什么区别?

25、Synchronized有哪几种用法?

26、Fork/Join框架是干什么的?

27、如何给线程传递参数?

28、说说线程安全的和不安全的集合。

29、什么是CAS算法?在多线程中有哪些应用。

30、你遇到过哪些多线程的问题?都是如何解决的?

精选30道Java多线程面试题的更多相关文章

  1. [刘阳Java]_精选20道Java多线程面试题

    1. 多线程使用的优缺点? 优点: (1)多线程技术使程序的响应速度更快 (2)当前没有进行处理的任务可以将处理器时间让给其它任务 (3)占用大量处理时间的任务可以定期将处理器时间让给其它任务 (4) ...

  2. 【笔试题】精选30道Java笔试题解答

    转自于:精选30道Java笔试题解答 精选30道Java笔试题解答 1. 下面哪些是Thread类的方法() A. start() B. run() C. exit() D. getPriority( ...

  3. 精选30道Java笔试题附答案分析

    精选30道Java笔试题解答 都是一些非常非常基础的题,是我最近参加各大IT公司笔试后靠记忆记下来的,经过整理献给与我一样参加各大IT校园招聘的同学们,纯考Java基础功底,老手们就不用进来了,免得笑 ...

  4. java面试题—精选30道Java笔试题解答(二)

    摘要: java面试题-精选30道Java笔试题解答(二) 19. 下面程序能正常运行吗() public class NULL { public static void haha(){ System ...

  5. 一线大厂面试官最喜欢问的15道Java多线程面试题

    前言 在任何Java面试当中多线程和并发方面的问题都是必不可少的一部分.如果你想获得更多职位,那么你应该准备很多关于多线程的问题. 他们会问面试者很多令人混淆的Java线程问题.面试官只是想确信面试者 ...

  6. 53道java多线程面试题整理及答案(2018年)

    最近看到网上流传着,各种面试经验及面试题,往往都是一大堆技术题目贴上去,而没有答案. 为此我业余时间整理了Java多线程相关的53道常见面试题,及详细答案,你可以用它来好好准备面试.望各路大牛,发现不 ...

  7. 精选30道Java笔试题解答

    转自:http://www.cnblogs.com/lanxuezaipiao/p/3371224.html 都 是一些非常非常基础的题,是我最近参加各大IT公司笔试后靠记忆记下来的,经过整理献给与我 ...

  8. java面试题—精选30道Java笔试题解答(一)

    下面都是我自己的答案非官方,仅供参考,如果有疑问或错误请一定要提出来,大家一起进步啦~~~ 1. 下面哪些是Thread类的方法() A start() B run() C exit() D getP ...

  9. 最近常问的99道Java多线程面试题 !

    前言 今天给大家更新的是一篇关于多线程面试的文章,也是霸哥根据时下热门的面试内容给大家进行总结的, 本篇文章属于干货内容! 请各位读者朋友一定要坚持读到最后,完整阅读本文后相信你对多线程会有不一样感悟 ...

随机推荐

  1. C学习笔记-多源文件的编译

    多源文件的意义 为了精简代码和更好的维护代码,往往需要将一些功能实现的代码与主函数代码分开来 在使用的时候再主函数中调用 多源文件的使用 假设现有my.c和main.c两个源代码文件,现在要再main ...

  2. 手把手教你用原始方式上传项目至GitHub

    小编GitHub:https://github.com/ds1889 首先你得注册一个自己的GitHub账号,注册网址:https://github.com/join 有了自己的账号以后,就可以进行登 ...

  3. Linux札记

    1. tar.gz 压缩命令:tar  -zcvf   压缩文件名.tar.gz   被压缩文件名 解压命令:tar  -zxvf   压缩文件名.tar.gz

  4. 服务器:消息18456,级别16,状态1 用户‘sa’登录失败解决方法

    无法连接到服务器**:  服务器:消息18456,级别16,状态1   [Microsoft][ODBC   SQL   Server   Driver][Sql   server]   用户 'sa ...

  5. PAT B1016.部分A+B(15)

    B1016.部分A+B(15) #include <cstdio> #include <cstring> int calc(long long a, long long da) ...

  6. django进阶版4

    目录 1 Auth模块是什么 2 auth模块常用方法 authenticate() login(HttpRequest, user) logout(request) is_authenticated ...

  7. redis 主从、哨兵、集群

    出处: redis主从复制和哨兵 Redis集群方式共有三种:主从模式,哨兵模式,cluster(集群)模式 一.Redis主从复制 主从复制:主节点负责写数据,从节点负责读数据,主节点定期把数据同步 ...

  8. Codeforces 1238D. AB-string

    传送门 求合法的串看一眼很不可做 考虑一下总方案减去不合法方案 考虑如何求不合法的串,首先串中连续的相同字符一定是回文串的一部分 然后考虑 $AB$ 交错的情况,发现对于某个 $A$ 它如果左右都有 ...

  9. 7-Perl 数组

    1.Perl 数组Perl 数组一个是存储标量值的列表变量,变量可以是不同类型.数组变量以 @ 开头.访问数组元素使用 $ + 变量名称 + [索引值] 格式来读取,实例如下:#!/usr/bin/p ...

  10. Java深入分析类与对象

    深入分析类与对象 1,成员属性封装 在类之中的组成就是属性与方法,一般而言方法都是对外提供服务的,所以是不会进行封装处理的,而对于属性需要较高的安全性,所以往往需要对其进行保护,这个时候就需要采用封装 ...