【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();
    }
}

时间: 2024-12-20 08:58:06

【java】:多线程面试题的相关文章

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

Java 线程面试问题 在任何Java面试当中多线程和并发方面的问题都是必不可少的一部分.如果你想获得任何股票投资银行的前台资讯职位,那么你应该准备很多关于多线程 的问题.在投资银行业务中多线程和并发是一个非常受欢迎的话题,特别是电子交易发展方面相关的.他们会问面试者很多令人混淆的Java线程问题.面试官只 是想确信面试者有足够的Java线程与并发方面的知识,因为候选人中有很多只浮于表面.用于直接面向市场交易的高容量和低延时的电子交易系统在本质上是并 发的.下面这些是我在不同时间不同地点喜欢问的

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

java多线程面试题整理及答案(2018年) 什么是线程? 线程是操作系统能够进行运算调度的最小单位,它被包含在进程之中,是进程中的实际运作单位.程序员可以通过它进行多处理器编程,你可以使用多线程对 运算密集型任务提速.比如,如果一个线程完成一个任务要100毫秒,那么用十个线程完成改任务只需10毫秒.Java在语言层面对多线程提供了卓越的支 持,它也是一个很好的卖点. 线程和进程有什么区别? 线程是进程的子集,一个进程可以有很多线程,每条线程并行执行不同的任务.不同的进程使用不同的内存空间,而所

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

前言 在任何Java面试当中多线程和并发方面的问题都是必不可少的一部分.如果你想获得更多职位,那么你应该准备很多关于多线程的问题. 他们会问面试者很多令人混淆的Java线程问题.面试官只是想确信面试者有足够的Java线程与并发方面的知识,因为候选人中有很多只浮于表面.现在引用Java5并发包关于并发工具和并发集合的问题正在增多.那些问题中ThreadLocal.Blocking Queue.Counting Semaphore和ConcurrentHashMap比较流行. Java多线程面试题及

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

v java多线程面试题选择题大全含答案 1.下面程序的运行结果()(选择一项)public static void main(String[] args) {Thread t=new Thread(){public void run(){pong();}};t.run();System.out.println("ping");}static void pong(){System.out.println("pong");}A. pingpongB. pongping

JAVA多线程面试题

1.Thread 类中的start() 和 run() 方法有什么区别? Thread.start()方法(native)启动线程,使之进入就绪状态,当cpu分配时间该线程时,由JVM调度执行run()方法. 当你调用start()方法时你将创建新的线程,并且执行在run()方法里的代码.但是如果你直接调用run()方法,它不会创建新的线程也不会执行调用线程的代码. 2.Java中Runnable和Callable有什么不同? Runnable和Callable都代表那些要在不同的线程中执行的任

50个Java多线程面试题

不管你是新程序员还是老手,你一定在面试中遇到过有关线程的问题.Java 语言一个重要的特点就是内置了对并发的支持,让 Java 大受企业和程序员的欢迎.大多数待遇丰厚的 Java 开发职位都要求开发者精通多线程技术并且有丰富的 Java 程序开发.调试.优化经验,所以线程相关的问题在面试中经常会被提到. 在典型的 Java 面试中, 面试官会从线程的基本概念问起, 如:为什么你需要使用线程, 如何创建线程,用什么方式创建线程比较好(比如:继承 thread 类还是调用 Runnable 接口),

java多线程面试题整理及答案

1) 什么是线程? 线程是操作系统能够进行运算调度的最小单位,它被包含在进程之中,是进程中的实际运作单位.程序员可以通过它进行多处理器编程,你可以使用多线程对 运算密集型任务提速.比如,如果一个线程完成一个任务要100毫秒,那么用十个线程完成改任务只需10毫秒.Java在语言层面对多线程提供了卓越的支 持,它也是一个很好的卖点. 2) 线程和进程有什么区别? 线程是进程的子集,一个进程可以有很多线程,每条线程并行执行不同的任务.不同的进程使用不同的内存空间,而所有的线程共享一片相同的内存空间.别

java 多线程面试题

0.Java中多线程同步是什么? 在多线程程序下,同步能控制对共享资源的访问.如果没有同步,当一个Java线程在修改一个共享变量时,另外一个线程正在使用或者更新同一个变量,这样容易导致程序出现错误的结果. 1.解释实现多线程的几种方法? Java线程可以实现Runnable接口或者继承Thread类来实现,当你打算多重继承时,优先选择实现Runnable.还可以使用线程池. 2.Thread.start()与Thread.run()有什么区别? Thread.start()方法(native)启

Java多线程面试题归纳

1.多线程有哪几种实现方法?举个例子说明下线程的同步. (1)Java多线程有两种实现方式:继承Thread类和实现Runnable接口,Thread就是实现了Runnable接口. 两个最简单的线程例子: package chc.runnable; public class ThreadTest2 { public static void main(String[] args) throws InterruptedException { Thread1 t = new Thread1(); /

15个顶级Java多线程面试题及答案

1)现在有T1.T2.T3三个线程,你怎样保证T2在T1执行完后执行,T3在T2执行完后执行? 这个线程问题通常会在第一轮或电话面试阶段被问到,目的是检测你对”join”方法是否熟悉.这个多线程问题比较简单,可以用join方法实现. 2)在Java中Lock接口比synchronized块的优势是什么?你需要实现一个高效的缓存,它允许多个用户读,但只允许一个用户写,以此来保持它的完整性,你会怎样去实现它? lock接口在多线程和并发编程中最大的优势是它们为读和写分别提供了锁,它能满足你写像Con