【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) 什么是线程? 线程是操作系统能够进行运算调度的最小单位,它被包含在进程之中,是进程中的实际运作单位.程序员可以通过它进行多处理器编程,你可以使用多线程对 运算密集型任务提速.比如,如果一个线程完 ...
随机推荐
- java面试题复习(六)
51.实现多线程的方法 一种是继承Thread类:另一种是实现Runnable接口.两种方式都要通过重写run()方法来定义线程的行为,推荐使用后者,因为Java中的继承是单继承,一个类有一个父类,如 ...
- python大法好——python json
Python JSON 本章节我们将为大家介绍如何使用 Python 语言来编码和解码 JSON 对象. JSON(JavaScript Object Notation) 是一种轻量级的数据交换格式, ...
- RocketMQ入门(生产者)_2
从 RocketMQ环境搭建_1 我们已经建立了MQ的Server,接下来就是简单的生产和消费的过程. 1. rocketMQ的源码中有个示例代码example ,我们从Apache官网中可以下载源 ...
- fsync和fdatasync
在看LevelDB源码的时候,看到PosixWritableFile类的Sync函数用到了fsync和fdatasync两个Linux系统调用来将文件的修改同步到磁盘上,所以粗浅的学习了一下这两个系统 ...
- lnmp环境部署脚本-y
系统环境:centos6.X #!/bin/bash#date:2018-01-01## MySQL 安装8版本的话不太适合,有待于添加安装脚本进行测试#新版的MySQL安装需要高版本2.8以上cma ...
- 三个猜数字游戏代码(Python)
def binary_search(list,item): low = 0 high = len(list)-1 while low <= high: mid = (low + high)//2 ...
- runners
saltstack return 除了在配置文件中可以定义外(太繁琐),还可以自定义retunner,当然,这需要通过代码实现了,实现方式和自定义的pillar和grains类似,步骤如下: #创建_ ...
- 2018-2019-2 20175213实验一 《Java开发环境的熟悉》实验报告
第一部分实验要求:1 建立“自己学号exp1”的目录2 在“自己学号exp1”目录下建立src,bin等目录3 javac,java的执行在“自己学号exp1”目录4 提交 Linux或Window或 ...
- 并发系列2:Java并发的基石,volatile关键字、synchronized关键字、乐观锁CAS操作
由并发大师Doug Lea操刀的并发包Concurrent是并发编程的重要包,而并发包的基石又是volatile关键字.synchronized关键字.乐观锁CAS操作这些基础.因此了解他们的原理对我 ...
- 安装mysql数据库出现错误"系统找不到指定文件"
http://blog.csdn.net/Marvel__Dead/article/details/63262641?locationNum=4&fps=1