经常面试的时候,让写各种乱七八糟的多线程面试题,收集了很多,有些还是挺好玩的。


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】:多线程面试题的更多相关文章

  1. 15个顶级Java多线程面试题及回答

    Java 线程面试问题 在任何Java面试当中多线程和并发方面的问题都是必不可少的一部分.如果你想获得任何股票投资银行的前台资讯职位,那么你应该准备很多关于多线程 的问题.在投资银行业务中多线程和并发 ...

  2. 【OD深入学习】Java多线程面试题

    一.参考文章 1. Java线程面试题 Top 50 2. Java面试——多线程面试题 3. JAVA多线程和并发基础面试问答 4. 15个顶级Java多线程面试题及回答 二.逐个解答 三.一语中的 ...

  3. 40道经典java多线程面试题

    40道经典java多线程面试题 题目来源 看完了java并发编程的艺术,自认为多线程"大成",然后找了一些面试题,也发现了一些不足. 一下问题来源于网上的博客,答案均为本人个人见解 ...

  4. 一线大厂面试官最喜欢问的15道Java多线程面试题

    前言 在任何Java面试当中多线程和并发方面的问题都是必不可少的一部分.如果你想获得更多职位,那么你应该准备很多关于多线程的问题. 他们会问面试者很多令人混淆的Java线程问题.面试官只是想确信面试者 ...

  5. java多线程面试题选择题大全含答案

    v java多线程面试题选择题大全含答案 java多线程面试题选择题大全含答案 1.下面程序的运行结果()(选择一项)public static void main(String[] args) {T ...

  6. 50个Java多线程面试题

    不管你是新程序员还是老手,你一定在面试中遇到过有关线程的问题.Java 语言一个重要的特点就是内置了对并发的支持,让 Java 大受企业和程序员的欢迎.大多数待遇丰厚的 Java 开发职位都要求开发者 ...

  7. 50个Java多线程面试题(上)

    Java 语言一个重要的特点就是内置了对并发的支持,让 Java 大受企业和程序员的欢迎.大多数待遇丰厚的 Java 开发职位都要求开发者精通多线程技术并且有丰富的 Java 程序开发.调试.优化经验 ...

  8. java多线程面试题整理及答案(2018年)

    1) 什么是线程? 线程是操作系统能够进行运算调度的最小单位,它被包含在进程之中,是进程中的实际运作单位.程序员可以通过它进行多处理器编程,你可以使用多线程对 运算密集型任务提速.比如,如果一个线程完 ...

  9. java多线程面试题(来自转载)

    在典型的Java面试中, 面试官会从线程的基本概念问起, 如:为什么你需要使用线程, 如何创建线程,用什么方式创建线程比较好(比如:继承thread类还是调用Runnable接口),然后逐渐问到并发问 ...

  10. java多线程面试题整理及答案(2019年)

    1) 什么是线程? 线程是操作系统能够进行运算调度的最小单位,它被包含在进程之中,是进程中的实际运作单位.程序员可以通过它进行多处理器编程,你可以使用多线程对 运算密集型任务提速.比如,如果一个线程完 ...

随机推荐

  1. Python第9天

    迭代器(减少代码量增强可读性)和生成器(只能遍历一次):遵循迭代器协议,就是生成可迭代对象 生产者和消费者模型:可触发生成器运行的方法 直接调用next方法 用系统next+生成器的方法 send y ...

  2. 页面跳转、URL直接访问限制

    问题 URL控制是为了避免以下错误 当前页需要读取上一页缓存,但是当前页直接通过URL访问无法获得相应的缓存 当前页需要通过入口,清楚历史中保留的缓存,但是当前页直接通过URL访问没有清除 本质上是为 ...

  3. [Linux]Ubuntu与终端破墙

    参考:https://www.jianshu.com/p/941bf811f9c2 亲测在ubuntu-14.04.4-desktop-amd64.iso上安装成功 福利:https://github ...

  4. python web编程之网络基础

    1.TCP/IP协议 1)分层 应用层,传输层,网络层,接口层 2)Ip地址 3)域名 4)URL统一资源定位符 格式:    [协议]://[主机]:[端口]/[路径]?[参数] 协议是HTTP,F ...

  5. JVM内存模型和面试题解析

    一.JVM运行时区域 其中, 线程私有的:程序计数器,虚拟机栈,本地方法栈 线程共享的:堆,方法区,直接内存 1 程序计数器 程序计数器是一块较小的内存空间,可以看作是当前线程所执行的字节码的行号指示 ...

  6. springboot + schedule

    参考文章:https://blog.csdn.net/sinianliushui/article/details/78841713 参考文章: https://blog.csdn.net/hao703 ...

  7. v-for key

    key 当 Vue.js 用 v-for 正在更新已渲染过的元素列表时,它默认用“就地复用”策略.如果数据项的顺序被改变,Vue 将不会移动 DOM 元素来匹配数据项的顺序, 而是简单复用此处每个元素 ...

  8. MySQL8.0.x免安装配置

    目录 概述 下载 配置环境变量 编辑配置文件 初始化MySQL 安装MySQL系统(Windows)服务 初始化MySQL 启动MySQL 修改默认密码 开启远程登录 概述 MySQL从5.7一下子跳 ...

  9. Unreal4360全景视频序列渲染

    Unreal4 自带360全景渲染的插件 插件名称叫 Stereo Panoramic Movie Capture 一.打开Edit下的Plugins 二.搜索Stereo Panoramic Mov ...

  10. SSRS表达式里引用.net dll

    在SSRS的表达式里使用了一个.NET的DLL,用来生成条码图片,发布以后用不了. 需要修改一个SSRS的权限配置项,确保Report_Expressions_Default_Permissions的 ...