Java多线程的多种实现方式
-
通过继承Thread类重写run方法
public class MyThread extends Thread{ @Override public void run(){ System.out.println("invoked run()") } }
-
实现Runable接口重写run方法
public class MyThread extends Runable{ @Override public void run(){ System.out.println("invoked run()") } }
-
通过Callable和FutureTask创建线程,实现Callable的方法会有返回值
银行对账不可能用一个线程去查询,他会创建很多线程去获取账单数据,所以需要每个线程执行完成后返回对账数据
class MyThread implements Callable<Integer>{ @Override public Integer call() throws Exception { System.out.println(Thread.currentThread().getName()+"\t call()"); //处理时间 TimeUnit.SECONDS.sleep(5); return 1024; } } public class CallableDemo { public static void main(String[] args) throws ExecutionException, InterruptedException { MyThread myThread = new MyThread(); FutureTask<Integer> futureTask1 = new FutureTask<>(myThread); new Thread(futureTask1,"AA").start(); FutureTask<Integer> futureTask2 = new FutureTask<>(myThread); new Thread(futureTask2,"BB").start(); FutureTask<Integer> futureTask3 = new FutureTask<>(myThread); new Thread(futureTask3,"CC").start(); // 建议获取值放到最后 //要求获得Callable线程的计算结果,如果没有计算完成就要去强求,会导致阻塞,直到计算完成 Integer value1 = futureTask1.get(); Integer value2 = futureTask1.get(); Integer value3 = futureTask1.get(); } }
FutureTask在获取值的时候方法有阻塞
public V get() throws InterruptedException, ExecutionException { int s = state; if (s <= COMPLETING) s = awaitDone(false, 0L); return report(s); }
-
匿名类部类创建
new Thread(()->{ System.out.println("invoked run()") },"线程名称")
-
通过线程池创建线程
//指定线程池线程数 ExecutorService threadPool = Executors.newFixedThreadPool(5); //单个线程 ExecutorService threadPool2 = Executors.newSingleThreadExecutor(); //缓存线程池 ExecutorService threadPool3 = Executors.newCachedThreadPool(); //模拟10个用户来请求数据 for (int i = 0; i < 10; i++) { threadPool.execute(()->{ System.out.println("执行的业务代码"); }); }