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 多端打包
1.在environments文件夹里新建三个文件: //生产环境 environment.prod.ts: export const environment = { production: true ...
- 64位win7连接ACCESS报错“Microsoft.Jet.OLEDB.4.0”问题
本人开发了桌面软件,关于事务提醒,自己一直在用,很喜欢,但是在64位win7上无法运行,网上说多种方法,都觉得麻烦.后来自己在vs2012下编译成x86版本,结果可以运行在64位win7下了. 原来如 ...
- day17_python_1124
01 昨日内容回顾 包: 1,在内存中创建一个以包命名的空间. 2,执行包的__init__文件将文件中的名字加载到包的名称空间. 3,通过包名.名字(变量,函数,类名)方式调用这些内容. aaa.x ...
- unity中实现场景之间加载进度条
using UnityEngine; using System.Collections; using UnityEngine.SceneManagement; using UnityEngine.UI ...
- java service 安装
sudo ln -s /var/services/video/video-live.jar /etc/init.d/live-service sudo chmod +x /var/services/v ...
- 学习java的第4天 (2019-03-21 11:49)
学习java的第4天 好文要顶 关注我 收藏该文 里里零关注 - 0粉丝 - 0 0 0 posted on 2019-03-21 11:49 编辑 抱歉! ...
- JAVA8之函数式接口
由于JDK8已经发布一段时间了,也开始逐渐稳定,未来使用JAVA语言开发的系统会逐渐升级到JDK8,因为为了以后工作需要,我们有必要了解JAVA8的一些新的特性.JAVA8相对JAVA7最重要的一个突 ...
- 对Enum的认识
1.如何把枚举值取出来作为数据源: public enum AuditState { 未审核 = 1, 审核通过=2, 审核未通过=3, ...
- 重开ES6
一.ES6的开发环境搭建 现在的Chrome浏览器已经支持ES6了,但是有些低版本的浏览器还是不支持ES6的语法,这就需要我们把ES6的语法自动的转变成ES5的语法. 1.建立工程目录: 先建立一个项 ...
- go延时队列
package main import ( "errors" "flag" "fmt" log "github.com/cihub ...