在我们日常开发中,经常会碰到以下几种情况
1.大数据量的处理 如 数据同步,数据简单处理,数据的检验等
2.某段代码的速度慢
针对不同的情况,我们可以采取多线程的方式进行优化,先简单地看3种多线程的实现方式
1.继承Thread实现多线程
1.重写Thread的run方法
package com.wwj.test.thread;
public class MyThread extends Thread {
@Override
public void run() {
System.out.println(Thread.currentThread().getName());
}
}
2.通过start方法调用
package com.wwj.test.thread;
public class Main {
public static void main(String[] args) {
MyThread myThread = new MyThread();
myThread.start();
}
}
2.实现Runable接口实现多线程
1.实现Runable的run方法
package com.wwj.test.thread;
public class MyRunable implements Runnable {
@Override
public void run() {
System.out.println(Thread.currentThread().getName());
}
}
2.通过Thread.start方法启动多线程 或者 直接是用lambda表达式
package com.wwj.test.thread;
public class Main {
public static void main(String[] args) {
// MyThread myThread = new MyThread();
// myThread.start();
// Thread myThread = new Thread(new MyRunable());
// myThread.start();
new Thread(() ->{
System.out.println(Thread.currentThread().getName());
}).start();
}
}
3.实现Callable接口实现多线程
通过以上2种方法都可以实现多线程的应用,但是都不能直接在主线程中获取到其它线程的返回结果,因此,在一些特定的情况下我们可以采用异步编程的方式实现多线程
1.实现Callable接口
package com.wwj.test.thread;
import java.util.concurrent.Callable;
public class MyCallable implements Callable<Integer> {
@Override
public Integer call() throws Exception {
System.out.println(Thread.currentThread().getName());
return 0;
}
}
2.用过Thread.start启动多线程,并拿到返回结果
package com.wwj.test.thread;
import java.util.concurrent.ExecutionException;
import java.util.concurrent.FutureTask;
public class Main {
public static void main(String[] args) throws ExecutionException, InterruptedException {
// MyThread myThread = new MyThread();
// myThread.start();
// Thread myThread = new Thread(new MyRunable());
// myThread.start();
// new Thread(() ->{
// System.out.println(Thread.currentThread().getName());
// }).start();
//创建MyCallable对象
MyCallable myCallable = new MyCallable();
//开始线程
FutureTask<Integer> integerFutureTask = new FutureTask<>(myCallable);
new Thread(integerFutureTask).start();
int a = integerFutureTask.get();
System.out.println(a);
}
}