线程池:
会创建一些固定的可重复使用的线程数,会在线程池中,循环利用
当某些线程使用完毕,不会被释放掉,而是归还连接池中,等待下一次再去利用!
成本比普通创建线程方式要大!
java.util.concurrent.Exceutors 工厂类
public static ExecutorService newFixedThreadPool(int nThreads)
创建固定的可重复的线程数的线程池
java.util.concurrent ExecutorService ----->接口的具体实现类 public class ThreadPoolExecutor
<T> Future<T> submit(Callable<T> task):提交异步任务,返回值就是异步任务计算的结果;
上面这个的返回值Future :异步计算的结果---如果现在只是看多个线程是否能够并发的去强转CPU执行权,并没有返回结果
这个返回值可以不用返回!
Callable:接口---->异步任务的执行 类似于 之前Runnable接口
void shutdown():关闭线程池
publicclassMyCallableimplementsCallable<Integer>{privateInteger a;publicMyCallable(Integer a){this.a = a;}@OverridepublicIntegercall()throwsException{for(int x =1; x <=a ; x++){
a+=x;System.out.println(Thread.currentThread().getName()+":"+a);}return a;}}publicclassThreadTest{publicstaticvoidmain(String[] args){ExecutorService es =Executors.newFixedThreadPool(2);Integer a =100;Future<?> submit = es.submit(newMyCallable(a));try{Object o = submit.get();}catch(InterruptedException e){
e.printStackTrace();}catch(ExecutionException e){
e.printStackTrace();}
es.shutdown();}}
Thread的方法
启动线程,想知道哪一个线程执行数据---Thread类提供一些基本功能:
public final void setName(String name):设置线程的名称
public final String getName():获取线程名称
public final void join() throws InterruptedException 等待该线程终止
public static void yield():暂停当前正在执行的线程,执行其他线程
线程的优先级:
public static final int MAX_PRIORITY 10 最大优先级
public static final int MIN_PRIORITY 1 最大优先级
public static final int NORM_PRIORITY 5 默认优先级
优先级越大,线程抢占CPU执行权的几率越大!
给线程设置优先级
public final void setPriority(int newPriority)
获取线程的优先级
public final int getPriority()
TreeMap<K,V>-->针对键有效,排序(自然排序/比较器排序)
构造方法:
public TreeMap():自然排序
public TreeMap(Comparator<? super K> comparator):比较器排序
如果键是自定义类型,键必须唯一,而且需要有排序规则!
TreeSet<引用类型,String> 来按照学生的年龄从小到大排序(主要条件)
publicclassDemo{publicstaticvoidmain(String[] args){TreeSet<Worker> ts =newTreeSet<>(newComparator<Worker>(){@Overridepublicintcompare(Worker o1,Worker o2){int n = o1.getAge()-o2.getAge();int m =(n==0)?(o2.getName().compareTo(o1.getName())):n;return m;}});
ts.add(newWorker("xiaoming",9));
ts.add(newWorker("xiaowang",23));
ts.add(newWorker("wangwu",20));for(Worker w:ts){System.out.println(w.getName()+"--"+w.getAge());}}}publicclassWorker{privateString name;privateint age;publicWorker(){}publicWorker(String name,int age){this.name = name;this.age = age;}@Overridepublicbooleanequals(Object o){if(this== o)returntrue;if(o ==null||getClass()!= o.getClass())returnfalse;Worker worker =(Worker) o;return age == worker.age && name.equals(worker.name);}@OverridepublicinthashCode(){returnObjects.hash(name, age);}publicStringgetName(){return name;}publicvoidsetName(String name){this.name = name;}publicintgetAge(){return age;}publicvoidsetAge(int age){this.age = age;}@OverridepublicStringtoString(){return"Worker{"+"name='"+ name +'\''+", age="+ age +'}';}}
Lock
Lock实现提供比使用synchronized方法和语句可以获得的更广泛的锁定操作
实现类:
可重入的互斥锁 java.util.concurrent.locks.ReentrantLock
获取锁:指定的某个时刻 public void lock()
释放锁 : public void unlock()
Lock l = ...;
l.lock();
try {
// access the resource protected by this lock
} finally {
l.unlock(); //释放锁(系统相关的资源)
}
Timer计时器
java.util.Timer:定时器(可以执行一次或者重复执行某个任务)
构造方法:
Timer():创建一个计时器
成员方法
public void cancel()取消定时器
void schedule(TimerTask task, Date time) :在给定的日期时间来执行TimerTask定时任务 ---> String dataStr = "2022-11-22 18:00" ;//---->日期文本---->java.util.Date
(应用场景:引入使用io流的方式,在指定时间点上,删除指定带内容的目录里面的所有.java文件)
void schedule(TimerTask task, long delay) :在给定多少毫秒后(延迟时间)执行这个定时任务
public void schedule(TimerTask task,long delay,long period):在指定延迟时间(delay)执行任务,
然后每经过固定延迟时间(period)重复执行任务
schedule这些方法第一个参数都是定时任务:TimerTask是一个抽象类,
1)可以定义具体的子类继承自TimerTask
2)直接可以使用抽象类的匿名内部类