多线程含义及使用
多线程含义
最终目的解决等待问题。
- 通过并行计算提高程序执行性能
- 需要等待网络、 I/O响应导致耗费大量的执行时间,可以采用异步线程的方式来减少阻塞
tomcat以前的io模型
- 客户端阻塞
如果客户端只有一个线程,这个线程发起读取文件的操作必须等待IO 流返回,线程(客户端)才能做其他的事
- 线程级别阻塞 BIO
客户端一个线程情况下,一个线程导致整个客户端阻塞。那么我们可以使用多线程,一部分线程在等待 IO 操作返回其他线程可以继续做其他的事。此时从客户端角度来说,客户端没有闲着。
多线程应用
在java中,有多种方式
继承Thread类、实现Runnable接口、使用ExecutorService、Callable、Future实现带返回结果的多线程。
-
继承Thread类
public class MyThread extends Thread{ public void run(){ System.out.println("MyThread.run()"); } } public static void main(String[] args){ MyThread myThread = new MyThread(); myThread.start(); }
-
实现Runable接口
public class MyThread implements Runnable { public void run() { System.out.println("MyThread.run()"); } public static void main(String[] args) { Thread thread = new Thread(new MyThread()); thread.start(); } }
-
实现Callable接口通过FutureTask包装器来创建Thread线程
public class CallableDemo implements Callable<String> { @Override public String call() throws Exception { int a = 1; int b = 2; System.out.println(a + b); return "执行结果" + (a + b); } public static void main(String[] args) throws ExecutionException, InterruptedException { ExecutorService executorService = Executors.newFixedThreadPool(1); CallableDemo callableDemo = new CallableDemo(); Future<String> future = executorService.submit(callableDemo); System.out.println(future.get()); executorService.shutdown(); } }
优雅处理线程
zookeeper 源码: 通过阻塞队列以及多线程的方式,实现对请求的异步化处理,提升处理性能
阻塞队列:LinkedBlockingQueue(无界阻塞队列)