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的差别. ...
随机推荐
- webstorm crack
webstorm 2018.2注册码如下:{"licenseId":"ThisCrackLicenseId","licenseeName": ...
- excel表格中,怎么根据一列重复的数据求对应另一列总和
如下: 求出姓名对应分数总和对应 : 首先复制一份Sheet2 对Sheet1进行操作选中A列姓名 数据->删除重复项->以前选中区域排序->删除重复项 然后删除对应成绩项选中张三对 ...
- C++获取网络数据
1. 获取数据 工具libcurl libcurl主要功能就是用不同的协议连接和沟通不同的服务器.libcurl当前支持http, https, ftp, gopher, telnet, dict, ...
- flask 自动切换环境
简介: 我就是个半吊子程序员.在单位写点程序,在家也写点程序. 单位是企业网,不能上互联网,家里也没办法连上企业网,没有VPN. 主武器是我的笔记本电脑.在单位有一台淘汰的linux服务器,家里有个N ...
- PHP_CodeSniffer 安装和phpstorm配置
安装 1.mac安装 sudo pear install PHP_CodeSniffer phpstorm配置 1. 点击菜单:File->Settings 或 按快捷键 Ctrl+Alt+S ...
- java 线程操作
停止线程 创建“停止标记”,thread.interrupt() 准确的说interrupt()方法只是“告知线程该停止了”,而线程检查到该“告知”后,再通过其他的办法停止线程. 线程调用了inter ...
- js splice函数 数组增加,替换,删除
splice函数参数介绍: 第一个参数: 对于数数组的操作起始位置. 第二个参数: 从第一个参数开始,删除数组中的个数. 从第三个参数之后所有参数(如果有):执行完第二步之后,都插入到第一个参数的起始 ...
- SQL-48 将所有获取奖金的员工当前的薪水增加10%。
题目描述 将所有获取奖金的员工当前的薪水增加10%.create table emp_bonus(emp_no int not null,recevied datetime not null,btyp ...
- Python中异常处理
高级语言通常都配置了一套try...except...finally的错误处理机制. 1.我们先看一个try的机制 try: res=1/0except ZeroDivisionError as e: ...
- ubuntu pip install MySQL-python mysql_config not found
在安装 mysql-python时,会出现: sh: mysql_config: not found Traceback (most recent call last): File "s ...