笔记:(四) 线程、多线程和线程池

java基础+android基础面试题整理:
原文地址:https://www.jianshu.com/p/c70989bd5f29

解答整理:

(四) 线程、多线程和线程池

问:开启线程的三种方式?
答:1、定义一个类继承Thread类,覆盖Thread类的run方法;run方法中的代码是线程执行体;然后调用线程对象的start方法;
2、定义一个类实现Runnable接口,注意该类不是线程类,在类中覆盖Runnable的接口方法run;run方法里是线程执行体;将新建类作为参数传给Thread,启动线程;
以上两种,实现方式可以做到多线程共享同一个资源。
https://blog.csdn.net/jiangyu1013/article/details/58585289
3、使用ExecutorService、Callable、Future实现有返回结果的多线程。都是属于Executor框架中的功能类。返回结果的线程是在JDK1.5中引入的新特征。可返回值的任务必须实现Callable接口,无返回值的任务必须实现Runnable接口。执行Callable任务后,可以获取一个Future对象,在该对象上调用get就可获取Callable任务返回的Object,再结合线程池接口ExecutorService实现传说中的有返回结果的多线程。
ExecutoreService提供了submit()方法,传递一个Callable,或Runnable,返回Future。如果Executor后台线程池还没有完成Callable的计算,这调用返回Future对象的get()方法,会阻塞直到计算完成。
https://blog.csdn.net/aboy123/article/details/38307539

线程和进程的区别?
为什么要有线程,而不是仅仅用进程?

问:run()和start()方法区别
答:start方法是启动一个线程,调用run方法好比是对象调用方法,并没有开启新的线程。

问:如何控制某个方法允许并发访问线程的个数?
答:static Semaphore semaphore = new Semaphore(5,true);
semaphore.acquire();//申请一个请求
semaphore.release();//释放一个请求
构造函数创建了一个 Semaphore 对象,并且初始化了 5 个信号。这样的效果是控制 test 方法最多只能有 5 个线程并发访问,多于 5 个线程时就排队等待,走一个来下一个;
请求一个信号(消费一个信号),如果信号被用完了则等待;
释放一个信号,释放了信号,新的线程就可以使用了。
http://www.cnblogs.com/androidsuperman/p/6349586.html

问:在Java中wait和seelp方法的不同;
答:sleep方法属于Thread类,wait方法属于Object类;
sleep()方法导致了程序暂停执行指定的时间,让出cpu该其他线程,但是他的监控状态依然保持者,当指定的时间到了又会自动恢复运行状态。
调用sleep()方法的过程中,线程不会释放对象锁
而当调用wait()方法的时候,线程会放弃对象锁,进入等待此对象的等待锁定池,只有针对此对象调用notify()方法后本线程才进入对象锁定池准备获取对象锁进入运行状态。
http://www.cnblogs.com/hongten/p/hongten_java_sleep_wait.html

问:谈谈wait/notify关键字的理解
答:

问:什么导致线程阻塞?
答:阻塞状态的线程的特点是:该线程放弃CPU的使用,暂停运行,只有等到导致阻塞的原因消除之后才恢复运行,或者是被其他的线程中断,该线程也会退出阻塞状态,同时抛出InterruptedException。
1)线程执行了Thread.sleep(intmillsecond);方法,当前线程放弃CPU,睡眠一段时间,然后再恢复执行;
2)线程执行一段同步代码,但是尚且无法获得相关的同步锁,只能进入阻塞状态,等到获取了同步锁,才能回复执行。
3)线程执行了一个对象的wait()方法,直接进入阻塞状态,等待其他线程执行notify()或者notifyAll()方法。
4)线程执行某些IO操作,因为等待相关的资源而进入了阻塞状态。比如说监听system.in,但是尚且没有收到键盘的输入,则进入阻塞状态。

问:线程如何关闭?
答:stop是线程不安全的,一般采用interrupt,判断线程是否中止采用isInterrupted, 如果线程中有Thread.sleep方法,当设置中断后,执行这个方法会抛出异常,就务必在异常中继续关闭线程。
//触发条件设置中断
thread.interrupt();
//如果抛出异常则再次设置中断请求
Thread.currentThread().interrupt();

讲一下java中的同步的方法

问:数据一致性如何保证?
答:数据一致性通常指关联数据之间的逻辑关系是否正确和完整。而数据存储的一致性模型则可以认为是存储系统和数据使用者之间的一种约定。
严格一致性、顺序一致性、因果一致性、管道一致性、弱一致性、释放一致性、最终一致性、delta consistency。
https://zhidao.baidu.com/question/563283644.html

问:如何保证线程安全?
答:保证类线程安全的措施:
1、不共享线程间的变量;
2、设置属性变量为不可变变量;
3、每个共享的可变变量都使用一个确定的锁保护。
保证线程安全的思路:
1、通过架构设计
2、保证类无状态
3、区别原子操作和复合操作
4、锁
https://segmentfault.com/a/1190000006969348

如何实现线程同步?
两个进程同时要求写或者读,能不能实现?如何防止进程的同步?

问:线程间操作List
答:Collections.synchronizedList可以得到本身不是线程安全的容易的线程安全的状态
线程安全仅仅指的是如果直接使用它提供的函数,比如:add(obj);或者poll(obj);这样我们自己不需要做任何同步。
https://www.jianshu.com/p/7a7985653651

Java中对象的生命周期
Synchronized用法
synchronize的原理

问:谈谈对Synchronized关键字,类锁,方法锁,重入锁的理解
答:java的内置锁:每个java对象都可以用做一个实现同步的锁,这些锁成为内置锁。线程进入同步代码块或方法的时候会自动获得该锁,在退出同步代码块或方法时会释放该锁。获得内置锁的唯一途径就是进入这个锁的保护的同步代码块或方法。
java内置锁是一个互斥锁,这就是意味着最多只有一个线程能够获得该锁,当线程A尝试去获得线程B持有的内置锁时,线程A必须等待或者阻塞,直到线程B释放这个锁,如果B线程不释放这个锁,那么A线程将永远等待下去。
java的对象锁和类锁:java的对象锁和类锁在锁的概念上基本上和内置锁是一致的,但是,两个锁实际是有很大的区别的,对象锁是用于对象实例方法,或者一个对象实例上的,类锁是用于类的静态方法或者一个类的class对象上的。我们知道,类的对象实例可以有很多个,但是每个类只有一个class对象,所以不同对象实例的对象锁是互不干扰的,但是每个类只有一个类锁。但是有一点必须注意的是,其实类锁只是一个概念上的东西,并不是真实存在的,它只是用来帮助我们理解锁定实例方法和静态方法的区别的
synchronized的用法:synchronized修饰方法和synchronized修饰代码块。
java编译器在编译成字节码的时候,会对代码进行一个重排序,也就是说,编译器会根据实际情况对代码进行一个合理的排序,编译前代码写在前面,在编译后的字节码不一定排在前面。
这里涉及到内置锁的一个概念(此概念出自java并发编程实战第二章):对象的内置锁和对象的状态之间是没有内在的关联的,虽然大多数类都将内置锁用做一种有效的加锁机制,但对象的域并不一定通过内置锁来保护。当获取到与对象关联的内置锁时,并不能阻止其他线程访问该对象,当某个线程获得对象的锁之后,只能阻止其他线程获得同一个锁。之所以每个对象都有一个内置锁,是为了免去显式地创建锁对象。
所以synchronized只是一个内置锁的加锁机制,当某个方法加上synchronized关键字后,就表明要获得该内置锁才能执行,并不能阻止其他线程访问不需要获得该内置锁的方法。
synchronized的缺陷:当某个线程进入同步方法获得对象锁,那么其他线程访问这里对象的同步方法时,必须等待或者阻塞,这对高并发的系统是致命的,这很容易导致系统的崩溃。如果某个线程在同步方法里面发生了死循环,那么它就永远不会释放这个对象锁,那么其他线程就要永远的等待。这是一个致命的问题。
一个类的对象锁和另一个类的对象锁是没有关联的,当一个线程获得A类的对象锁时,它同时也可以获得B类的对象锁。

https://blog.csdn.net/le_le_name/article/details/52348314

问:static synchronized 方法的多线程访问和作用
答:

同一个类里面两个synchronized方法,两个线程同时访问的问题
volatile的原理
谈谈volatile关键字的用法
谈谈volatile关键字的作用
谈谈NIO的理解
synchronized 和volatile 关键字的区别
synchronized与Lock的区别
ReentrantLock 、synchronized和volatile比较
ReentrantLock的内部实现
lock原理
死锁的四个必要条件?
怎么避免死锁?
对象锁和类锁是否会互相影响?
什么是线程池,如何使用?
Java的并发、多线程、线程模型
谈谈对多线程的理解
多线程有什么要注意的问题?
谈谈你对并发编程的理解并举例说明
谈谈你对多线程同步机制的理解?
如何保证多线程读写文件的安全?
多线程断点续传原理
断点续传的实现

(五)并发编程有关知识点(这个是一般Android开发用的少的,所以建议多去看看):

平时Android开发中对并发编程可以做得比较少,Thread这个类经常会用到,但是我们想提升自己的话,一定不能停留在表面,,我们也应该去了解一下java的关于线程相关的源码级别的东西。
学习的参考资料如下:
Java 内存模型
java线程安全总结
深入理解java内存模型系列文章
线程状态:
一张图让你看懂JAVA线程间的状态转换
锁:
锁机制:synchronized、Lock、Condition
Java 中的锁
并发编程:
Java并发编程:Thread类的使用
Java多线程编程总结
Java并发编程的总结与思考
Java并发编程实战—–synchronized
深入分析ConcurrentHashMap

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值