在工作当中,个人常用多线程来做一些数据处理的工作,以此来加快数据处理速度。截止到Java8,实现多线程有4种写法,记下相关代码备查。
通过继承Tread类开启多线程
public static void main(String[] args) {
System.out.println("主线程名称:" + Thread.currentThread().getName());
Task task1 = new Task();
Task task2 = new Task();
task1.start();
task2.start();
}
public static class Task extends Thread {
@Override
public void run() {
try {
for (int i = 0; i < 10; i++) {
System.out.println("线程" + Thread.currentThread().getName() + "的消息:" + i);
Thread.sleep(800);
}
} catch (InterruptedException ex) {
ex.printStackTrace();
}
}
}
通过Runnable接口实现多线程
public static void main(String[] args) {
System.out.println("主线程名称:" + Thread.currentThread().getName());
Thread task1 = new Thread(new Task());
Thread task2 = new Thread(new Task());
task1.start();
task2.start();
}
public static class Task implements Runnable {
@Override
public void run() {
try {
for (int i = 0; i < 10; i++) {
System.out.println("线程" + Thread.currentThread().getName() + "的消息:" + i);
Thread.sleep(800);
}
} catch (InterruptedException ex) {
ex.printStackTrace();
}
}
}
通过Callable+FutureTask实现带返回值的多线程
public static void main(String[] args) {
System.out.println("主线程名称:" + Thread.currentThread().getName());
Callable<String> crb1 = new Task();
Callable<String> crb2 = new Task();
FutureTask<String> task1 = new FutureTask<>(crb1);
FutureTask<String> task2 = new FutureTask<>(crb2);
Thread thread1 = new Thread(task1);
Thread thread2 = new Thread(task2);
thread1.start();
thread2.start();
try {
System.out.println("task1返回结果:" + task1.get());
System.out.println("task2返回结果:" + task2.get());
} catch (Exception e) {
System.out.println("获取FutureTask返回结果异常:" + e.getMessage());
}
}
public static class Task implements Callable<String> {
@Override
public String call() throws Exception {
try {
for (int i = 0; i < 10; i++) {
System.out.println("线程" + Thread.currentThread().getName() + "的消息:" + i);
Thread.sleep(800);
}
} catch (InterruptedException ex) {
ex.printStackTrace();
}
return "返回结果:" + Thread.currentThread().getName();
}
}
通过线程池技术实现多线程(推荐)
Executors
public static void main(String[] args) {
System.out.println("主线程名称:" + Thread.currentThread().getName());
ExecutorService executorService = Executors.newFixedThreadPool(2);
executorService.execute(new Task());
executorService.execute(new Task());
}
public static class Task implements Runnable {
@Override
public void run() {
try {
for (int i = 0; i < 10; i++) {
System.out.println("线程" + Thread.currentThread().getName() + "的消息:" + i);
Thread.sleep(800);
}
} catch (InterruptedException ex) {
ex.printStackTrace();
}
}
}
ThreadPoolExecutor
public static void main(String[] args) {
System.out.println("主线程名称:" + Thread.currentThread().getName());
ThreadPoolExecutor executorService = new ThreadPoolExecutor(2, 2, 5, TimeUnit.MINUTES, new LinkedBlockingDeque<Runnable>());
executorService.execute(new Task());
executorService.execute(new Task());
}
public static class Task implements Runnable {
@Override
public void run() {
try {
for (int i = 0; i < 10; i++) {
System.out.println("线程" + Thread.currentThread().getName() + "的消息:" + i);
Thread.sleep(800);
}
} catch (InterruptedException ex) {
ex.printStackTrace();
}
}
}