8)如何指定多个线程的执行顺序?
解析:面试官会给你举个例子,如何让 10 个线程按照顺序打印 0123456789?(写代码实现)
答:
设定一个 orderNum,每个线程执行结束之后,更新 orderNum,指明下一个要执行的线程。并且唤醒所有的等待线程。
在每一个线程的开始,要 while 判断 orderNum 是否等于自己的要求值!!不是,则 wait,是则执行本线程。
???
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
public class OrderedThreadDemo {
public static void main(String[] args) {
Holder holder = new Holder(0);
List<Thread> threads = new ArrayList<>(15);
List<Integer> orders = new ArrayList<>();
for (int i=0; i<=10; i++) {
orders.add(i);
}
Collections.shuffle(orders);
for (int i : orders) {
Thread thread = new OrderedThread(holder, i);
threads.add(thread);
thread.start();
}
for (Thread t: threads) {
try {
t.join();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}
class OrderedThread extends Thread {
int order;
Holder holder;
public OrderedThread(Holder holder, int order) {
this.holder = holder;
this.order = order;
}
public void run() {
synchronized (holder) {
while (order != holder.global) {
try {
holder.wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
System.out.println(Thread.currentThread().getName() + ": " + holder.global);
holder.global++;
holder.notifyAll();
}
}
}
class Holder {
public int global;
public Holder(int global) {
this.global = global;
}
}
面试官:我们为什么要使用线程池?
答:
减少创建和销毁线程的次数,每个工作线程都可以被重复利用,可执行多个任务。
可以根据系统的承受能力,调整线程池中工作线程的数目,放置因为消耗过多的内存,而把服务器累趴下(每个线程大约需要 1 MB 内存,线程开的越多,消耗的内存也就越大,最后死机
8)创建线程有哪几种方式?
答:有两种创建线程的方法:一是实现Runnable接口,然后将它传递给Thread的构造函数,创建一个Thread对象;二是直接继承Thread类。
面试官:两种方式有什么区别呢?
继承方式:
(1)Java中类是单继承的,如果继承了Thread了,该类就不能再有其他的直接父类了.
(2)从操作上分析,继承方式更简单,获取线程名字也简单.(操作上,更简单)
(3)从多线程共享同一个资源上分析,继承方式不能做到.?????
实现方式:
(1)Java中类可以多实现接口,此时该类还可以继承其他类,并且还可以实现其他接口(设计上,更优雅).
(2)从操作上分析,实现方式稍微复杂点,获取线程名字也比较复杂,得使用Thread.currentThread()来获取当前线程的引用.
(3)从多线程共享同一个资源上分析,实现方式可以做到(是否共享同一个资源).
String intern()方法
作者:我没有三颗心脏
链接:https://www.jianshu.com/p/7382c0a843ff
來源:简书
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。