这段时间正好项目上线一个版本,趁着这个时间总结一下。在做验证模块的时候正好用到了多线程,其实老早之前就看过多线程的东西但是做了好几个项目了都没有用过,项目中用过了但是自己负责的模块没有用到,正好这次用到了,趁此机会复习一下多线程这块儿。
业务介绍
批量验证的一个业务,主要是批量用户进行验证他们的信息。如果用单线程,数据量大的时候,消耗时间太长,导致给用户反馈较慢,影响用户体验。这个时候就想起来用多线程去解决了。
业务分析
多线程创建及启动有三种形式,选择一种我们业务中合适的一种。下面先介绍一下这三种。
第一种:继承Thread类,重写该类的run()方法。
public class MyThread extends Thread {
@Override
public void run() {
System.out.println("多线程extends thread");
}
}
public class ThreadTest {
public static void main(String[] args) {
Thread myThread = new MyThread(); // 创建一个新的线程 myThread 此线程进入新建状态
myThread.start(); // 调用start()方法使得线程进入就绪状态
}
}
继承Thread类,通过重写run()方法定义了一个新的线程类MyThread,其中run()方法的方法体代表了线程需要完成的任务,称之为线程执行体。当创建此线程类对象时一个新的线程得以创建,并进入到线程新建状态。通过调用线程对象引用的start()方法,使得该线程进入到就绪状态
第二种:实现Runnable接口,并重写该接口的run()方法
public class MyRunnable implements Runnable {
@Override
public void run() {
System.out.println("多线程implements Runnable");
}
}
public class ThreadTest {
public static void main(String[] args) {
Runnable myRunnable = new MyRunnable(); // 创建一个Runnable实现类的对象
Thread thread = new Thread(myRunnable); // 将myRunnable作为Thread target创建新的线程
thread.start(); // 调用start()方法使得线程进入就绪状态
}
}
实现Runnable接口,并重写该接口的run()方法,该run()方法同样是线程执行体,创建Runnable实现类的实例,并以此实例作为Thread类的target来创建Thread对象,该Thread对象才是真正的线程对象。
第三种:使用Callable和Future接口创建线程
public class MyCallable implements Callable<String> {
// 与run()方法不同的是,call()方法具有返回值
@Override
public String call() {
String str = "多线程implements Callable";
return str;
}
}
public class ThreadTest {
public static void main(String[] args) throws InterruptedException,
ExecutionException {
Callable<String> myCallable = new MyCallable(); // 创建MyCallable对象
FutureTask<String> ft = new FutureTask<String>(myCallable); // 使用FutureTask来包装MyCallable对象
Thread thread = new Thread(ft); // FutureTask对象作为Thread对象的target创建新的线程
thread.start(); // 线程进入到就绪状态
System.out.println("主线程执行完毕..");
String str = ft.get(); // 取得新创建的新线程中的call()方法返回的结果
System.out.println("str = " + str);
}
}
具体是创建Callable接口的实现类,并实现call()方法。并使用FutureTask类来包装Callable实现类的对象,且以此FutureTask对象作为Thread对象的target来创建线程。最不同上面两种的就是第三种带有返回值。
我们的业务需求也是需要把执行的结果返回回来,给每个用户进行验证完以后把验证结果返回来。所以第三种最符合我们的需求,我们就采用的第三种方式。
到此为止,基本上已经分析完该用哪种方式,在接触的过程中,多线程这块儿还有很多东西需要学习,每个阶段跟每个阶段领悟的不一样,所以小编要继续回去再啃啃《Java多线程编程核心技术》去啦,虽然已经看过几遍了。