java基础(七)-线程
实现线程的方式:
1.继承Thread
2.实现Runable接口
3.实现Callable,和Runable的区别是有回调方法。
区别 :实现Runable接口扩展性更好,因为继承只能单向继承
相关面试题:
什么是线程:
线程是操作系统运行的最小单元;进程里包含了多个线程,他们处理不同的任务,组成了一个应用或者一个系统的整体逻辑。
Thread.yield():让步,当一个线程执行yield()方法,证明该线程执行让步,让其他线程有可能的获取资源运行。
Thead.join(): 加入,当一个线程执行join(),证明该线程执行加入操作,会终止当前正在运行的线程,开始执行join的线程。
Thread 优先级:Thread.currentThread().setPrority(value);value=Max_prority;Norm_priority;Min_priority;三种不同的优先等级;
Thread.setDaemon(boolean);设置当前线程为后台线程,后台线程要在start之前调用才有效。后台线程,是指程序运行的时候在后台提供一种通用服务的线程,且这种线程并不属于程序中不可或缺的部分;只要有任何非后台线程在运行,程序就不会终止。
sleep和wait的区别
最大的不同是在等待时 wait 会释放锁,而 sleep 一直持有锁。wait 通常被用于线程间交互,sleep 通常被用于暂停执行。
Exector(执行器)
Exector会统一管理线程。
newCachedThreadPool会为每一个任务创建一个线程。
public class LifeOff implements Runnable{
private int countDown=10;
private static int taskCount=0;
private final int id=taskCount++;
public LifeOff(int countDown) {
this.countDown = countDown;
}
public LifeOff() { }
@Override
public void run() {
Thread.currentThread().setPriority(Thread.MAX_PRIORITY);
while (countDown-->0){
System.out.print(status());
Thread.yield();//让步
}
}
public String status(){
return "#"+Thread.currentThread().getName()+"("+(countDown>0 ? countDown:"lifeoff!\n")+")";
}
}
ExecutorService executor = Executors.newCachedThreadPool();
executor.execute(new LifeOff());
executor.shutdown();
newFixedThreadPool会创建固定数量的线程来执行任务。
ExecutorService executor = Executors.newFixedThreadPool(3);
executor.execute(new LifeOff());
executor.shutdown();
newSingleThreadExector会创建一个线程来执行任务。如有多个任务,会排队加载任务。执行一个结束,才会处理下一个任务。
ExecutorService executor = Executors.newSingleThreadExecutor();
executor.execute(new LifeOff());
executor.shutdown();
executor.shutdown();是不接受任务以外的其他任务列表;