【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) 什么是线程? 线程是操作系统能够进行运算调度的最小单位,它被包含在进程之中,是进程中的实际运作单位.程序员可以通过它进行多处理器编程,你可以使用多线程对 运算密集型任务提速.比如,如果一个线程完 ...
随机推荐
- stm32 HAL库笔记(一)——串口的操作
昨天分析了普通io口的使用,和初始化代码流程,回顾一下,首先定义一个配置io口功能的结构体,然后开启时钟,再去配置这个结构体里面的各个成员变量,每个成员变量都有很多种选择,可以看各个成员变量 后面的注 ...
- Jeecg-Boot 1.0版本发布,企业级快速开发平台
Jeecg-Boot 一款基于代码生成器的J2EE快速开发框架! 采用前后端分离技术: SpringBoot,Mybatis-plus,Shiro,JWT,Vue & Ant Design. ...
- Django应用app创建及ORM
一.重要知识点回顾: 1. form表单提交数据的注意事项: 1. 是form不是from,必须要有method和action (action用来指定你的数据提交到后台哪个地方,method用来指定你 ...
- docker 相关
https://www.cnblogs.com/neptunemoon/p/6512121.html centos7 安装docker1.更新yum包yum update2.卸载旧版本(如果安装过旧版 ...
- Linux命令:help
语法 help: help [-dms] [模式 ...] 显示内建命令的相关信息. 显示内建命令的简略信息.如果指定了 PATTERN 模式,给出所有匹配 PATTERN 模式的命令的详细帮助,否则 ...
- SQL Server扩展事件的使用ring_buffer target时“丢失”事件的原因分析以及ring_buffer target潜在的问题
事情起因: 排查SQL Server上的死锁问题,一开始想到的就是扩展事件, 第一种方案,开profile守株待兔吧,显得太low了,至于profile的变种trace吧,垂垂老矣,也一直没怎么用过. ...
- validate表单验证
validate使用步骤:1.导入jquery.js2.导入validate.js3.在页面加载成功之后 对表单进行校验 $("选择器").validate()4.在valida ...
- linux下面重启nfs报错:nfs-server.service:main process exited
linux下面重启nfs报错:nfs-server.service:main process exited [root@dhcp-66-83-39 images]# service rpcbind s ...
- 管理多个gradle,SDKMAN
背景:同一台机器上有两个app需要编译,但是两个app的gradle版本不一致,所以需要安装一个管理gradle版本的工具 sdkman:(Software Development Kit Man ...
- Vue如何更新子组件
黑科技: 给子组件绑定一个key值,当key值改变时,子组件就会更新 ~