ThreadPool线程池相关知识
本片文章默认读者已经有进程,线程相关的知识!!!
创建进程的方式
1.继承Thread类进行创建
class MyThread extends Thread{
@Override//重写run方法
public void run() {
// TODO Auto-generated method stub
System.out.println("extend Thread!!!");
}
}
public static void main(String[] args) throws InterruptedException, ExecutionException {
MyThread myThread = new MyThread();
myThread.start();
}
2.实现Runnable接口
public static void main(String[] args) throws InterruptedException, ExecutionException {
MyThread myThread = new MyThread();
Thread thread = new Thread(myThread);
thread.start();
}
class MyThread implements Runnable{
@Override
public void run() {
// TODO Auto-generated method stub
System.out.println("implement Runnable!!!");
}
当然可以使用内部类和Lamada函数式编程,结合Thread和Runnable接口
public static void main(String[] args) throws InterruptedException, ExecutionException {
Thread thread = new Thread(() -> System.out.println("Combine Thread and Runnable"));
thread.start();
}
3.使用Callable和Future创建线程
和Runnable接口不一样,Callable接口提供了一个call()方法作为线程执行体,call()方法比run()方法功能要 强大。
call()方法可以有返回值!!!!
call()方法可以声明抛出异常
FutureTask futureTask = new FutureTask<>(new Callable<String>() {
@Override
public String call() throws Exception {
// TODO Auto-generated method stub
return "Create By FutureTask";
}
});
Thread myThread = new Thread(futureTask);
myThread.start();
System.out.println(futureTask.get());//会输出"Create By FutureTask"
还有一个接口名为Future接口,一般用来接受线程池返回的Callable接口,接下来讲解线程池会使用到
4.使用线程池进行创建
-
何为线程池
线程池(Thread Pool):把一个或多个线程通过统一的方式进行调度和重复使用的技术,避免了因为线程过多而带来使用上的开销。
-
为什么要使用线程池?
- 降低资源消耗。通过重复利用已创建的线程降低线程创建和销毁造成的消耗。
- 提高响应速度。当任务到达时,任务可以不需要等到线程创建就能立即执行。
- 提高线程的可管理性。
关于线程池的知识可以取看 线程池详解 的讲解,里面汇总了大量的线程池的知识!本篇文章主要是讲解利用线程池执行线程
1.使用execute执行线程
ExecutorService service = Executors.newFixedThreadPool(2);
service.execute(new Runnable() {//使用线程池创建执行Runnable线程
@Override
public void run() {
System.out.println("Use ThreadPool");
}
});
service.shutdown();
2.使用submit执行线程
ExecutorService service = Executors.newFixedThreadPool(2);
Future future = service.submit(new Callable<String>() {//Future用于接收callable的返回值
@Override
public String call() throws Exception {
// TODO Auto-generated method stub
return "Use ThreadPool";
}
});
System.out.println(future.get());
service.shutdown();
3.execute与submit的嵌套执行
ExecutorService service = Executors.newFixedThreadPool(2);
service.execute(new Runnable() {
@Override
public void run() {
Future future = service.submit(new Callable<String>() {
@Override
public String call() throws Exception {
// TODO Auto-generated method stub
return "嵌套";
}
});
try {
System.out.println(future.get());
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (ExecutionException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
});
service.shutdown();
4.execute嵌套execute
ExecutorService service = Executors.newFixedThreadPool(2);
service.execute(new Runnable() {
@Override
public void run() {
service.execute(new Runnable() {
@Override
public void run() {
System.out.println("嵌套");
}
});
}
});
Thread.sleep(1000);
service.shutdown();
以上就是常见的线程创建的四种方法,希望对大家有所帮助!!!