美文网首页
Java笔试题

Java笔试题

作者: mundane | 来源:发表于2022-03-08 11:10 被阅读0次

    1. 如何让t1,t2,t3这三个线程按顺序执行?

    这个题解法很多,这里先列2种

    • 解法一
            Thread t1 = new Thread(() -> {
                System.out.println(Thread.currentThread().getName() + "执行");
            }, "t1");
    
            Thread t2 = new Thread(() -> {
                try {
                    t1.join();
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
                System.out.println(Thread.currentThread().getName() + "执行");
            }, "t2");
    
            Thread t3 = new Thread(() -> {
                try {
                    t2.join();
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
                System.out.println(Thread.currentThread().getName() + "执行");
            }, "t3");
    
            t1.start();
            t2.start();
            t3.start();
    

    join方法的含义是该方法将挂起调用线程(当前线程)的执行,直到被调用的对象完成它的执行
    比如代码里,在t2线程中的t1.join()将挂起当前线程(t2线程)的执行,直到t1线程执行完了,t2线程才继续往下执行。
    例如在线程B中调用线程A的join(),那线程B会进入到阻塞队列,直到线程A结束或中断线程。

    • 解法二
            Runnable r1 = () -> System.out.println("r1执行");
    
            Runnable r2 = () -> System.out.println("r2执行");
    
            Runnable r3 = () -> System.out.println("r3执行");
    
            ExecutorService executorService = Executors.newSingleThreadExecutor();
            executorService.submit(r1);
            executorService.submit(r2);
            executorService.submit(r3);
            executorService.shutdown();
    

    这里利用了单线程线程池的特性

    2. 关于java中局部变量和传参的一道题

    public class ListDemo {
        public static void main(String[] args) {
            List<Object> list = new ArrayList<>();
            list.add("1");
            redefineList(list);
            System.out.println(list.size());
        }
    
        public static void redefineList(List<Object> list) {
            list = new ArrayList<>();
        }
    }
    

    问输出的是什么?
    答案:1
    解析:





    如图所示内存结构变化,在刚进入redefineList()方法之后,执行方法里面的代码之前(list = new ArrayList<>();), 两个局部变量都指向第一个list对象,size是1。
    在执行了list = new ArrayList<>();这一句之后,redefineList()方法里的局部变量list指向了第二个list对象。在执行完redefineList()方法之后,redefineList()方法出栈,redefineList()方法中的局部变量都清空。而main方法中的局部变量仍然指向第一个list对象。

    3. 开了20个线程,如何让这20个线程都执行完了main方法中的线程才继续执行

            // 创建10个线程,线程里面进行1000次循环
            for (int i = 0; i < 20; i++) {
                new Thread(() -> {
                    System.out.println("线程" + Thread.currentThread().getName() +"执行完了");
                }, String.valueOf(i)).start();
            }
            // todo
            System.out.println("主线程开始执行");
    

    相关文章

      网友评论

          本文标题:Java笔试题

          本文链接:https://www.haomeiwen.com/subject/csfarrtx.html