Java笔试题

2022-03-08  本文已影响0人  mundane

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("主线程开始执行");
上一篇 下一篇

猜你喜欢

热点阅读