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("主线程开始执行");
网友评论