【java】:多线程面试题
经常面试的时候,让写各种乱七八糟的多线程面试题,收集了很多,有些还是挺好玩的。
1、编写程序实现,子线程循环10次,接着主线程循环20次,接着再子线程循环10次,主线程循环20次,如此反复,循环50次.
package com.zhikui.interview; import java.util.concurrent.locks.Condition;
import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReentrantLock; /**@autor http://www.cnblogs.com/fingerboy/p/5352880.html
* @method 编写程序实现,子线程循环10次,接着主线程循环20次,接着再子线程循环10次,主线程循环20次,如此反复,循环50次.
*/
public class interviewTest1{ public static void main(String[] args) {
final Function fc= new Function();
//子线程
new Thread(new Runnable() { @Override
public void run() {
for(int i =0;i<50;i++){
fc.sub();
} }
}).start();
//主线程
for(int i =0;i<50;i++){
fc.main();
}
}
} class Function {
private boolean flag = false;
//Lock lock=new ReentrantLock();
// Condition con=lock.newCondition();
//子线程实现
public synchronized void sub(){
while(flag){
try {
this.wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
for(int i =0;i<10;i++){
System.out.println("[sub]"+i);
} flag = true;
this.notify();
}
//主线程实现
public synchronized void main(){
while(!flag){
try {
this.wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
for(int i =0;i<20;i++){
System.out.println("[main]"+i);
}
flag = false;
this.notify();
}
}
2、设计四个线程,其中两个线程每次对变量i加1,另外两个线程每次对i减1.
package com.zhikui.interview;
/**
* @methord设计四个线程,其中两个线程每次对变量i加1,另外两个线程每次对i减1.
* @author http://www.cnblogs.com/fingerboy/p/5352880.html
*
*/ public class interviewTest2 { private int i = 0; public static void main(String[] args) {
//执行线程
interviewTest2 it = new interviewTest2();
Add add = it.new Add();
Sub sub = it.new Sub();
for(int i=1;i<=2;i++){
new Thread(add,"线程"+i).start();
new Thread(sub,"线程"+i).start();
}
} class Add implements Runnable {
@Override
public void run() {
for(int j=0;j<10;j++){
addOne();
try {
Thread.sleep(100);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
} class Sub implements Runnable{
@Override
public void run() {
for(int j=0;j<10;j++){
subOne();
try {
Thread.sleep(100);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
} public synchronized void addOne(){
i++;
System.out.println(Thread.currentThread().getName()+"[加一的值为]"+i);
} public synchronized void subOne(){
i--;
System.out.println(Thread.currentThread().getName()+"[减一的值为]"+i);
}
}
3、T2 T3三个线程,怎样保证T2在T1执行完之后执行 T3在T2执行完之后执行
package com.zhikui.interview;
/**
* @methor现在有T1 T2 T3三个线程,怎样保证T2在T1执行完之后执行 T3在T2执行完之后执行
* @author http://blog.csdn.net/caohaicheng/article/details/38071097
*
*/
public class interviewTest3 { public static void main(String[] args) {
interviewTest3 it = new interviewTest3();
T1 t1 = it.new T1("t1");
T1 t2 = it.new T1("t2");
T1 t3 = it.new T1("t3");
t1.start();
try {
t1.join();
} catch (Exception e) {
e.printStackTrace();
} t2.start();
try {
t2.join();
} catch (Exception e) {
e.printStackTrace();
} t3.start();
try {
t3.join();
} catch (Exception e) {
e.printStackTrace();
} } class T1 extends Thread{
private String name;
public T1(String name){
this.name = name;
}
@Override
public void run(){
for(int i=0;i<5;i++){
try {
sleep(5);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
System.out.println(this.name+"循环"+i);
}
}
} class T2 extends Thread{
private String name;
public T2(String name){
this.name = name;
}
@Override
public void run(){
for(int i=0;i<5;i++){
try {
sleep(5);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
System.out.println(this.name+"循环"+i);
}
}
} class T3 extends Thread{
private String name;
public T3(String name){
this.name = name;
}
@Override
public void run(){
for(int i=0;i<5;i++){
try {
sleep(5);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
System.out.println(this.name+"循环"+i);
}
}
} }
4、写一个死锁的例子
package com.zhikui.interview;
/**
* 写一个死锁的例子
* @author author
*/
public class interviewTest4 {
private static Object A = new Object();
private static Object B = new Object();
public static void main(String[] args) {
//第一个线程
new Thread(new Runnable() {
@Override
public void run() {
while(true){
synchronized (A) {
synchronized (B) {
System.out.println("死锁A");
}
}
}
}
},"T1").start(); //第二个线程
new Thread(new Runnable() {
@Override
public void run() {
while(true){
synchronized (B) {
synchronized (A) {
System.out.println("死锁B");
}
}
}
}
},"T1").start();
} }
5、两个线程,一个线程输出1,一个线程输出2,循环输出
package com.zhikui.interview;
/**
* @methor两个线程,一个线程输出1,一个线程输出2,循环输出
* @author http://blog.csdn.net/fufengrui/article/details/30232603
*
*/
public class interviewTest5 {
public static void main(String[] args) {
OneThread one = new OneThread();
TwoThread two = new TwoThread();
one.start();
two.start();
}
} class OneThread extends Thread { @Override
public void run() {
synchronized (interviewTest5.class) {
while (true) {
System.out.println("1");
try {
interviewTest5.class.wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
interviewTest5.class.notify();
}
}
}
} class TwoThread extends Thread { @Override
public void run() {
synchronized (interviewTest5.class) {
while (true) {
System.out.println("2");
interviewTest5.class.notify();
try {
interviewTest5.class.wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}
}
6、有1-26个数字和a-z字母,用Java多线程实现先输出2和数字再输出2个字母
package com.zhikui.interview; /**
* 有1-26个数字和a-z字母,用Java多线程实现先输出2和数字再输出2个字母
*
* @author https://zhidao.baidu.com/question/201633880.html
*
*/
public class interviewTest6 {
public static void main(String[] args) {
Print p = new Print();
new numThread(p).start();
new charThread(p).start();
}
} class Print {
boolean boo = true;
char ch = 'A';
int num = 1; public synchronized void printNum() {
if (boo) {
try {
wait();
} catch (Exception e) {
}
System.out.print(num++);
System.out.print(num++);
}
boo = false;
notify();
if (num == 52)
num++;
} public synchronized void printChar() {
if (!boo) {
try {
wait();
} catch (Exception e) {
}
System.out.print(ch++);
System.out.print(ch++);
}
boo = true;
notify();
}
} class numThread extends Thread {
Print p = null; public numThread(Print p) {
this.p = p;
} public void run() {
while (p.num <= 53)
p.printNum(); }
} class charThread extends Thread {
Print p = null; public charThread(Print p) {
this.p = p;
} public void run() {
while (p.ch <= 'Z')
p.printChar();
}
}
【java】:多线程面试题的更多相关文章
- 15个顶级Java多线程面试题及回答
Java 线程面试问题 在任何Java面试当中多线程和并发方面的问题都是必不可少的一部分.如果你想获得任何股票投资银行的前台资讯职位,那么你应该准备很多关于多线程 的问题.在投资银行业务中多线程和并发 ...
- 【OD深入学习】Java多线程面试题
一.参考文章 1. Java线程面试题 Top 50 2. Java面试——多线程面试题 3. JAVA多线程和并发基础面试问答 4. 15个顶级Java多线程面试题及回答 二.逐个解答 三.一语中的 ...
- 40道经典java多线程面试题
40道经典java多线程面试题 题目来源 看完了java并发编程的艺术,自认为多线程"大成",然后找了一些面试题,也发现了一些不足. 一下问题来源于网上的博客,答案均为本人个人见解 ...
- 一线大厂面试官最喜欢问的15道Java多线程面试题
前言 在任何Java面试当中多线程和并发方面的问题都是必不可少的一部分.如果你想获得更多职位,那么你应该准备很多关于多线程的问题. 他们会问面试者很多令人混淆的Java线程问题.面试官只是想确信面试者 ...
- java多线程面试题选择题大全含答案
v java多线程面试题选择题大全含答案 java多线程面试题选择题大全含答案 1.下面程序的运行结果()(选择一项)public static void main(String[] args) {T ...
- 50个Java多线程面试题
不管你是新程序员还是老手,你一定在面试中遇到过有关线程的问题.Java 语言一个重要的特点就是内置了对并发的支持,让 Java 大受企业和程序员的欢迎.大多数待遇丰厚的 Java 开发职位都要求开发者 ...
- 50个Java多线程面试题(上)
Java 语言一个重要的特点就是内置了对并发的支持,让 Java 大受企业和程序员的欢迎.大多数待遇丰厚的 Java 开发职位都要求开发者精通多线程技术并且有丰富的 Java 程序开发.调试.优化经验 ...
- java多线程面试题整理及答案(2018年)
1) 什么是线程? 线程是操作系统能够进行运算调度的最小单位,它被包含在进程之中,是进程中的实际运作单位.程序员可以通过它进行多处理器编程,你可以使用多线程对 运算密集型任务提速.比如,如果一个线程完 ...
- java多线程面试题(来自转载)
在典型的Java面试中, 面试官会从线程的基本概念问起, 如:为什么你需要使用线程, 如何创建线程,用什么方式创建线程比较好(比如:继承thread类还是调用Runnable接口),然后逐渐问到并发问 ...
- java多线程面试题整理及答案(2019年)
1) 什么是线程? 线程是操作系统能够进行运算调度的最小单位,它被包含在进程之中,是进程中的实际运作单位.程序员可以通过它进行多处理器编程,你可以使用多线程对 运算密集型任务提速.比如,如果一个线程完 ...
随机推荐
- ajax入门基础
一.简介 AJAX = Asynchronous JavaScript and XML(异步的 JavaScript 和 XML). AJAX 是一种用于创建快速动态网页的技术. AJAX通过在后台与 ...
- Navicat 连接MariaDB 失败: Host '*' is not allowed to connect to this MariaDB server
题描述:Navicat 为管理方便,连接Linux 中Mariadb失败,如下如下错误:Host '*' is not allowed to connect to this MariaDB serve ...
- dax学习
增长率 = (DIVIDE(SUM('业绩达成'[实际业绩]),CALCULATE(SUM('业绩达成'[实际业绩]),PREVIOUSMONTH('业绩达成'[周期])))-1)*100上月业绩 = ...
- java中PriorityBlockingQueue 和DelayedWorkQueue 区别
java中PriorityBlockingQueue 和DelayedWorkQueue 区别
- notepad++之删除空行
正则表达式替换 查找目标: \r\n{0,1}[\s\t]*\r\n 替换为: \r\n 循环查找:勾选
- pytorch 生成随机数
在使用PyTorch做实验时经常会用到生成随机数Tensor的方法,比如: torch.rand() torch.randn() torch.normal() torch.linespace() 在很 ...
- JVM、redis缓存适用场景
1. 数据状态相对稳定:(针对数据本身)数据修改较少. 2. 输出的数据是相对幂等:(针对业务)多次查询期间,数据不变动.如果查询频率过高,缓存可能没有及时更新. 了解一下redis.ehcache. ...
- leetcode268缺失数字
int missingNumber(int* nums, int numsSize) { ) /; ;i<numsSize;i++){ sum = sum - nums[i]; } return ...
- vue之表单输入绑定
- 手眼标定之相机随动eye-in-hand 示例:handeye_movingcam_calibration
* * This example explains how to use the hand eye calibration for the case where* the camera is atta ...