线程池是容纳多个线程的容器,其中线程可以反复使用,避免反复创建线程对象的操作,节省资源。
线程池的操作:用线程池工厂创建线程池对象:ExecutorService es=Executors.newFixedThreadPool(5);
创建Runnable的接口的实现类,然后实例化对象
使用es的submit方法传入Runnable实现类的实例化对象,即可运行该线程。
es.shutdown关闭线程池
实现Callable接口的类可以实现返回值,用Future<泛型>接收。
以下是两个实例
例1:
public static void main(String[] args) { //1.通过线程池工厂获得线程池对象 ExecutorService es=Executors.newFixedThreadPool(5); ExecutorService es2=Executors.newFixedThreadPool(5); //2.获得线程对象并提交 es.submit(new MyRunnable()); es.submit(new MyRunnable()); es2.submit(new MyRunnable()); //销毁线程池 es.shutdown(); es2.shutdown(); }
例2:
public static void main(String[] args) throws InterruptedException, ExecutionException { ExecutorService es=Executors.newFixedThreadPool(3); Future<String> f=es.submit(new MyCallable()); System.out.println(f.get()); es.shutdown(); }
public class MyCallable implements Callable<String>{ public String call() throws Exception { System.out.println("call方法"); return "abc"; } }
在多线程调用同一资源时,可能由于cpu切换线程导致重复调用,或计算失误的情况,这个时候,运用锁来维护线程安全就成为很必要的事了。锁具有三种形式,第一种是同步代码块,第二种是同步方法,第三种是lock()与unlock()。
同步代码块的格式:
synchronized (锁对象) {
可能会产生线程安全问题的代码
}
锁对象可以是任意对象
同步方法:
public synchronized void method(){
可能会产生线程安全问题的代码
}
它的底层锁对象是this
同步嵌套同步,可能会出现死锁现象,是由于多线程各自对方的锁没有归还,导致线程无法“进门”。
通过实现lock接口来获取锁和释放锁,首先通过ReentrantLock()创造对象,然后通过该对象调用lock()和unlock()来实现获取锁和释放锁,释放锁的方法一般放在finally中。
等待唤醒机制,通过对象.wait(),和对象.notify(),来终止当前对象在运行的线程和启用当前等待的线程来实现线程交替进行的功能。