Java笔试面试题整理第六波(修正版)
转载至:http://blog.csdn.net/shakespeare001/article/details/51330745
作者:山代王(开心阳)
本系列整理Java相关的笔试面试知识点,其他几篇文章如下:
1、线程池ThreadPool相关
- public static ExecutorService newFixedThreadPool(int nThreads) {
- return new ThreadPoolExecutor(nThreads, nThreads,
- 0L, TimeUnit.MILLISECONDS,
- new LinkedBlockingQueue<Runnable>());
- }

public static ExecutorService newFixedThreadPool(int nThreads) {
return new ThreadPoolExecutor(nThreads, nThreads,
0L, TimeUnit.MILLISECONDS,
new LinkedBlockingQueue<Runnable>());
}
- public ThreadPoolExecutor(int corePoolSize,
- int maximumPoolSize,
- long keepAliveTime,
- TimeUnit unit,
- BlockingQueue<Runnable> workQueue,
- ThreadFactory threadFactory,
- RejectedExecutionHandler handler)

public ThreadPoolExecutor(int corePoolSize,
int maximumPoolSize,
long keepAliveTime,
TimeUnit unit,
BlockingQueue<Runnable> workQueue,
ThreadFactory threadFactory,
RejectedExecutionHandler handler)
- ExecutorService threadpool= Executors.newFixedThreadPool(10);
- threadpool.execute(new Runnable(){…});

ExecutorService threadpool= Executors.newFixedThreadPool(10);
threadpool.execute(new Runnable(){...});
这种方式提交没有返回值,也就不能判断任务是否被线程池执行成功。
- Future<?> future = threadpool.submit(new Runnable(){…});
- try {
- Object res = future.get();
- } catch (InterruptedException e) {
- // 处理中断异常
- e.printStackTrace();
- } catch (ExecutionException e) {
- // 处理无法执行任务异常
- e.printStackTrace();
- }finally{
- // 关闭线程池
- executor.shutdown();
- }

Future<?> future = threadpool.submit(new Runnable(){...});
try {
Object res = future.get();
} catch (InterruptedException e) {
// 处理中断异常
e.printStackTrace();
} catch (ExecutionException e) {
// 处理无法执行任务异常
e.printStackTrace();
}finally{
// 关闭线程池
executor.shutdown();
}

- public class BankCount {
- public synchronized void addMoney(int money){//存钱
- System.out.println(Thread.currentThread().getName() + ”>存入:” + money);
- }
- public synchronized void getMoney(int money){//取钱
- System.out.println(Thread.currentThread().getName() + ”>取钱:” + money);
- }
- }

public class BankCount {
public synchronized void addMoney(int money){//存钱
System.out.println(Thread.currentThread().getName() + ">存入:" + money);
}
public synchronized void getMoney(int money){//取钱
System.out.println(Thread.currentThread().getName() + ">取钱:" + money);
}
}
- public class BankTest {
- public static void main(String[] args) {
- final BankCount bankCount = new BankCount();
- ExecutorService executor = Executors.newFixedThreadPool(10);
- executor.execute(new Runnable() {//存钱线程
- @Override
- public void run() {
- int i = 5;
- while(i– > 0){
- bankCount.addMoney(200);
- try {
- Thread.sleep(500);
- } catch (InterruptedException e) {
- e.printStackTrace();
- }
- }
- }
- });
- Future<?> future = executor.submit(new Runnable() {//取钱线程
- @Override
- public void run() {
- int i = 5;
- while(i– > 0){
- try {
- Thread.sleep(500);
- } catch (InterruptedException e) {
- e.printStackTrace();
- }
- bankCount.getMoney(200);
- }
- }
- });
- try {
- Object res = future.get();
- System.out.println(res);
- } catch (InterruptedException e) {
- // 处理中断异常
- e.printStackTrace();
- } catch (ExecutionException e) {
- // 处理无法执行任务异常
- e.printStackTrace();
- }finally{
- // 关闭线程池
- executor.shutdown();
- }
- }
- }

public class BankTest {
public static void main(String[] args) {
final BankCount bankCount = new BankCount();
ExecutorService executor = Executors.newFixedThreadPool(10);
executor.execute(new Runnable() {//存钱线程
@Override
public void run() {
int i = 5;
while(i-- > 0){
bankCount.addMoney(200);
try {
Thread.sleep(500);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
});
Future<?> future = executor.submit(new Runnable() {//取钱线程
@Override
public void run() {
int i = 5;
while(i-- > 0){
try {
Thread.sleep(500);
} catch (InterruptedException e) {
e.printStackTrace();
}
bankCount.getMoney(200);
}
}
});
try {
Object res = future.get();
System.out.println(res);
} catch (InterruptedException e) {
// 处理中断异常
e.printStackTrace();
} catch (ExecutionException e) {
// 处理无法执行任务异常
e.printStackTrace();
}finally{
// 关闭线程池
executor.shutdown();
}
}
}
2、生产者和消费者模型
- /**
- * 仓库
- */
- public class Storage {
- private static final int MAX_SIZE = 100;//仓库的最大容量
- private List<Object> data = new ArrayList<Object>();//存储载体
- /**
- * 生产操作
- */
- public synchronized void produce(int num){
- if(data.size() + num > MAX_SIZE){//如果生产这些产品将超出仓库的最大容量,则生产操作阻塞
- System.out.println(”生产操作–>数量:” + num + “,超出仓库容量,生产阻塞!——库存:” + data.size());
- try {
- wait();
- } catch (InterruptedException e) {
- e.printStackTrace();
- }
- }
- //到这里,表示可以正常生产产品
- for(int i = 0; i < num; i++){//生产num个产品
- data.add(new Object());
- }
- System.out.println(”生产操作–>数量:” + num + “,成功入库~——库存:” + data.size());
- //生产完产品后,唤醒其他等待消费的线程
- notify();
- }
- /**
- * 消费操作
- */
- public synchronized void consume(int num){
- if(data.size() - num < 0){//如果产品数量不足
- System.out.println(”消费操作–>数量:” + num + “,库存不足,消费阻塞!——库存:” + data.size());
- try {
- wait();
- } catch (InterruptedException e) {
- e.printStackTrace();
- }
- }
- //到这里,表示可以正常消费
- for(int i = 0; i < num; i++){//消费num个产品
- data.remove(0);
- }
- System.out.println(”消费操作–>数量:” + num + “,消费成功~——库存:” + data.size());
- //消费完产品后,唤醒其他等待生产的线程
- notify();
- }
- }

/**
* 仓库
*/
public class Storage {
private static final int MAX_SIZE = 100;//仓库的最大容量
private List<Object> data = new ArrayList<Object>();//存储载体
/**
* 生产操作
*/
public synchronized void produce(int num){
if(data.size() + num > MAX_SIZE){//如果生产这些产品将超出仓库的最大容量,则生产操作阻塞
System.out.println("生产操作-->数量:" + num + ",超出仓库容量,生产阻塞!------库存:" + data.size());
try {
wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
//到这里,表示可以正常生产产品
for(int i = 0; i < num; i++){//生产num个产品
data.add(new Object());
}
System.out.println("生产操作-->数量:" + num + ",成功入库~------库存:" + data.size());
//生产完产品后,唤醒其他等待消费的线程
notify();
} /**
* 消费操作
*/
public synchronized void consume(int num){
if(data.size() - num < 0){//如果产品数量不足
System.out.println("消费操作-->数量:" + num + ",库存不足,消费阻塞!------库存:" + data.size());
try {
wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
//到这里,表示可以正常消费
for(int i = 0; i < num; i++){//消费num个产品
data.remove(0);
}
System.out.println("消费操作-->数量:" + num + ",消费成功~------库存:" + data.size());
//消费完产品后,唤醒其他等待生产的线程
notify();
} }
- public class Producer implements Runnable{
- private Storage storage;
- private int num;//每次生产多少个
- public Producer(Storage sto,int num){
- storage = sto;
- this.num = num;
- }
- @Override
- public void run() {
- storage.produce(num);
- }
- }

public class Producer implements Runnable{
private Storage storage;
private int num;//每次生产多少个
public Producer(Storage sto,int num){
storage = sto;
this.num = num;
}
@Override
public void run() {
storage.produce(num);
}
}
- public class Consumer implements Runnable{
- private Storage storage;
- private int num;//每次消费多少个
- public Consumer(Storage sto,int num){
- storage = sto;
- this.num = num;
- }
- @Override
- public void run() {
- storage.consume(num);
- }
- }

public class Consumer implements Runnable{
private Storage storage;
private int num;//每次消费多少个
public Consumer(Storage sto,int num){
storage = sto;
this.num = num;
}
@Override
public void run() {
storage.consume(num);
}
}
- public class StorageTest {
- public static void main(String[] args) {
- Storage storage = new Storage();
- ExecutorService taskSubmit = Executors.newFixedThreadPool(10); //来使用使用上一节我们总结的线程池知识
- //给定4个消费者
- taskSubmit.submit(new Consumer(storage, 30));
- taskSubmit.submit(new Consumer(storage, 10));
- taskSubmit.submit(new Consumer(storage, 20));
- //给定6个生产者
- taskSubmit.submit(new Producer(storage, 70));
- taskSubmit.submit(new Producer(storage, 10));
- taskSubmit.submit(new Producer(storage, 20));
- taskSubmit.submit(new Producer(storage, 10));
- taskSubmit.submit(new Producer(storage, 10));
- taskSubmit.submit(new Producer(storage, 10));
- taskSubmit.shutdown();
- }
- }

public class StorageTest {
public static void main(String[] args) {
Storage storage = new Storage();
ExecutorService taskSubmit = Executors.newFixedThreadPool(10); //来使用使用上一节我们总结的线程池知识
//给定4个消费者
taskSubmit.submit(new Consumer(storage, 30));
taskSubmit.submit(new Consumer(storage, 10));
taskSubmit.submit(new Consumer(storage, 20));
//给定6个生产者
taskSubmit.submit(new Producer(storage, 70));
taskSubmit.submit(new Producer(storage, 10));
taskSubmit.submit(new Producer(storage, 20));
taskSubmit.submit(new Producer(storage, 10));
taskSubmit.submit(new Producer(storage, 10));
taskSubmit.submit(new Producer(storage, 10));
taskSubmit.shutdown();
}
}
- XmppManager xmppManager = notificationService.getXmppManager();
- if(xmppManager != null){
- if(!xmppManager.isAuthenticated()){
- try {
- synchronized (xmppManager) {//等待客户端连接认证成功
- Log.d(LOGTAG, ”wait for authenticated…”);
- xmppManager.wait();
- }
- } catch (InterruptedException e) {
- e.printStackTrace();
- }
- }

XmppManager xmppManager = notificationService.getXmppManager();
if(xmppManager != null){
if(!xmppManager.isAuthenticated()){
try {
synchronized (xmppManager) {//等待客户端连接认证成功
Log.d(LOGTAG, "wait for authenticated...");
xmppManager.wait();
}
} catch (InterruptedException e) {
e.printStackTrace();
}
}
- /**
- * 仓库
- */
- public class Storage {
- private static final int MAX_SIZE = 100;//仓库的最大容量
- private List<Object> data = new ArrayList<Object>();//存储载体
- private Lock lock = new ReentrantLock();//可重入锁
- private Condition full = lock.newCondition();//仓库满的条件变量
- private Condition empty = lock.newCondition();//仓库空时的条件变量
- /**
- * 生产操作
- */
- public void produce(int num){
- lock.lock(); //加锁
- if(data.size() + num > MAX_SIZE){//如果生产这些产品将超出仓库的最大容量,则生产操作阻塞
- System.out.println(”生产操作–>数量:” + num + “,超出仓库容量,生产阻塞!——库存:” + data.size());
- try {
- full.await(); //阻塞
- } catch (InterruptedException e) {
- e.printStackTrace();
- }
- }
- //到这里,表示可以正常生产产品
- for(int i = 0; i < num; i++){//生产num个产品
- data.add(new Object());
- }
- System.out.println(”生产操作–>数量:” + num + “,成功入库~——库存:” + data.size());
- //生产完产品后,唤醒其他等待消费的线程
- empty.signalAll();
- lock.unlock(); //释放锁
- }
- /**
- * 消费操作
- */
- public void consume(int num){
- lock.lock(); //加锁
- if(data.size() - num < 0){//如果产品数量不足
- System.out.println(”消费操作–>数量:” + num + “,库存不足,消费阻塞!——库存:” + data.size());
- try {
- empty.await(); //阻塞
- } catch (InterruptedException e) {
- e.printStackTrace();
- }
- }
- //到这里,表示可以正常消费
- for(int i = 0; i < num; i++){//消费num个产品
- data.remove(0);
- }
- System.out.println(”消费操作–>数量:” + num + “,消费成功~——库存:” + data.size());
- //消费完产品后,唤醒其他等待生产的线程
- full.signalAll();
- lock.unlock(); //释放锁
- }
- }

/**
* 仓库
*/
public class Storage {
private static final int MAX_SIZE = 100;//仓库的最大容量
private List<Object> data = new ArrayList<Object>();//存储载体 private Lock lock = new ReentrantLock();//可重入锁
private Condition full = lock.newCondition();//仓库满的条件变量
private Condition empty = lock.newCondition();//仓库空时的条件变量 /**
* 生产操作
*/
public void produce(int num){
lock.lock(); //加锁
if(data.size() + num > MAX_SIZE){//如果生产这些产品将超出仓库的最大容量,则生产操作阻塞
System.out.println("生产操作-->数量:" + num + ",超出仓库容量,生产阻塞!------库存:" + data.size());
try {
full.await(); //阻塞
} catch (InterruptedException e) {
e.printStackTrace();
}
}
//到这里,表示可以正常生产产品
for(int i = 0; i < num; i++){//生产num个产品
data.add(new Object());
}
System.out.println("生产操作-->数量:" + num + ",成功入库~------库存:" + data.size());
//生产完产品后,唤醒其他等待消费的线程
empty.signalAll(); lock.unlock(); //释放锁
} /**
* 消费操作
*/
public void consume(int num){
lock.lock(); //加锁
if(data.size() - num < 0){//如果产品数量不足
System.out.println("消费操作-->数量:" + num + ",库存不足,消费阻塞!------库存:" + data.size());
try {
empty.await(); //阻塞
} catch (InterruptedException e) {
e.printStackTrace();
}
}
//到这里,表示可以正常消费
for(int i = 0; i < num; i++){//消费num个产品
data.remove(0);
}
System.out.println("消费操作-->数量:" + num + ",消费成功~------库存:" + data.size());
//消费完产品后,唤醒其他等待生产的线程
full.signalAll(); lock.unlock(); //释放锁
}
}
- public class Storage {
- private static final int MAX_SIZE = 100;//仓库的最大容量
- private BlockingQueue<Object> data = new LinkedBlockingQueue<Object>(MAX_SIZE); //使用阻塞队列作为存储载体
- /**
- * 生产操作
- */
- public void produce(int num){
- if(data.size() == MAX_SIZE){//如果仓库已达最大容量
- System.out.println(”生产操作–>仓库已达最大容量!”);
- }
- //到这里,表示可以正常生产产品
- for(int i = 0; i < num; i++){//生产num个产品
- try {
- data.put(new Object()); //put内部自动实现了判断,超过最大容量自动阻塞
- } catch (InterruptedException e) {
- e.printStackTrace();
- }
- }
- System.out.println(”生产操作–>数量:” + num + “,成功入库~——库存:” + data.size());
- }
- /**
- * 消费操作
- */
- public void consume(int num){
- if(data.size() == 0){//如果产品数量不足
- System.out.println(”消费操作–库存不足!”);
- }
- //到这里,表示可以正常消费
- for(int i = 0; i < num; i++){//消费num个产品
- try {
- data.take(); //take内部自动判断,消耗后库存是否充足,不足自我阻塞
- } catch (InterruptedException e) {
- e.printStackTrace();
- }
- }
- System.out.println(”消费操作–>数量:” + num + “,消费成功~——库存:” + data.size());
- }
- }

public class Storage {
private static final int MAX_SIZE = 100;//仓库的最大容量
private BlockingQueue<Object> data = new LinkedBlockingQueue<Object>(MAX_SIZE); //使用阻塞队列作为存储载体
/**
* 生产操作
*/
public void produce(int num){
if(data.size() == MAX_SIZE){//如果仓库已达最大容量
System.out.println("生产操作-->仓库已达最大容量!");
}
//到这里,表示可以正常生产产品
for(int i = 0; i < num; i++){//生产num个产品
try {
data.put(new Object()); //put内部自动实现了判断,超过最大容量自动阻塞
} catch (InterruptedException e) {
e.printStackTrace();
}
}
System.out.println("生产操作-->数量:" + num + ",成功入库~------库存:" + data.size());
}
/**
* 消费操作
*/
public void consume(int num){
if(data.size() == 0){//如果产品数量不足
System.out.println("消费操作--库存不足!");
}
//到这里,表示可以正常消费
for(int i = 0; i < num; i++){//消费num个产品
try {
data.take(); //take内部自动判断,消耗后库存是否充足,不足自我阻塞
} catch (InterruptedException e) {
e.printStackTrace();
}
}
System.out.println("消费操作-->数量:" + num + ",消费成功~------库存:" + data.size());
}
}
3、sleep和wait的区别
Java笔试面试题整理第六波(修正版)的更多相关文章
- Java笔试面试题整理第八波
转载至:http://blog.csdn.net/shakespeare001/article/details/51388516 作者:山代王(开心阳) 本系列整理Java相关的笔试面试知识点,其他几 ...
- Java笔试面试题整理第五波
转载至:http://blog.csdn.net/shakespeare001/article/details/51321498 作者:山代王(开心阳) 本系列整理Java相关的笔试面试知识点,其他几 ...
- Java笔试面试题整理第四波
转载至:http://blog.csdn.net/shakespeare001/article/details/51274685 作者:山代王(开心阳) 本系列整理Java相关的笔试面试知识点,其他几 ...
- Java笔试面试题整理第七波
转载至:http://blog.csdn.net/shakespeare001/article/details/51388516 作者:山代王(开心阳) 1.super的作用 在Java中su ...
- Java笔试面试题整理第三波
转载至:http://blog.csdn.net/shakespeare001/article/details/51247785 作者:山代王(开心阳) 本系列整理Java相关的笔试面试知识点,其他几 ...
- Java笔试面试题整理第二波
转载至:http://blog.csdn.net/shakespeare001/article/details/51200163 作者:山代王(开心阳) 本系列整理Java相关的笔试面试知识点,其他几 ...
- Java笔试面试题整理第一波
转载至:http://blog.csdn.net/shakespeare001/article/details/51151650 作者:山代王(开心阳) 本系列整理Java相关的笔试面试知识点,其他几 ...
- Java工程师笔试题整理[校招篇]
Java工程师笔试题整理[校招篇] 隔着两个月即将开始校招了.你是不是也想借着这个机会崭露头角,拿到某些大厂的offer,赢取白富美.走上人生巅峰?当然如果你还没能打下Java基础,一定要先打 ...
- Java笔试面试题007
Java笔试面试题007 1.请用正則表達式匹配出QQ号(如果QQ号码为5-10位). 解答: ^ \d{5,10}$ 2.String, StringBuffer StringBuilder的差别. ...
随机推荐
- 数据的双向绑定 Angular JS之开端篇
接触AngularJS许了,时常问自己一些问题,如果是我实现它,会在哪些方面选择跟它相同的道路,哪些方面不同.为此,记录了一些思考,给自己回顾,也供他人参考. 初步大致有以下几个方面: 数据双向绑定 ...
- 各大型网站架构分析收集-原网址http://blog.csdn.net/lovingprince/article/details/3379710
1. PlentyOfFish 网站架构学习http://www.dbanotes.net/arch/plentyoffish_arch.html 采取 Windows 技术路线的 Web 2.0 站 ...
- laravel 微信小程序登录 加密解密扩展包
https://github.com/lanceWan/wxxcx 测试的时候一定要保证服务器的 appid 和客户端的appid一致 如果是切换测试 那么需要把本地的项目从微信小程序上面删除掉 再 ...
- linux c使用socket进行http 通信,并接收任意大小的http响应(三)
使用socket进行http通信的时候,浏览器返回的响应经常不是固定长度的,有时候很大,有些时候又非常小,十分讨厌.如果仅仅只是为了接收一小段信息,设置一个十分大的缓存,这样又会十分浪费.而且经常更改 ...
- Python之路-文件操作(py3)
文件操作的基本步骤: 1.打开文件:f=open('filename'),with open('filename') as f 2.操作文件:增,删,改,查 3.关闭文件:f.close 打开文件 p ...
- Forth 词典和词汇
body, table{font-family: 微软雅黑; font-size: 13.5pt} table{border-collapse: collapse; border: solid gra ...
- 【转载】Oracle 中count(1) 、count(*) 和count(列名) 函数的区别
1)count(1)与count(*)比较: 1.如果你的数据表没有主键,那么count(1)比count(*)快2.如果有主键的话,那主键(联合主键)作为count的条件也比count(*)要快3. ...
- 【Java集合系列一】ArrayList解析
一.基础简介 1.ArrayList继承关系 2.底层用数组来存储数据,数据会在ArrayList创建的时候一并初始化.如果创建ArrayList的时候,没有设置容量,则会delay到第一次add数据 ...
- git安装及基本用法
安装: 1先安装客户端,选择默认路径,直接下一步就可以了 2安装图形化客户端,选择默认路径安装完成 基本用法: 1同步coding上的文件 在桌面上点击鼠标右键,并选择Git Clone... 打开下 ...
- alias-unalias
一.用一条命令完成创建目录/data/test,即在/目录下创建/data目录,及其子目录/data/test 解答:mkdir -p /data/test 实践过程: 二.已知/tmp目录下已经存在 ...