Java多线程——多线程创建的方法
继承线程类创建多线程
public class TestThread extends Thread{
//TestThread线程跑步
@Override
public void run() {
for (int i = 0; i < 100; i++) {
System.out.println("我跑了"+i+"米");
}
}
public static void main(String[] args) {
TestThread testThread = new TestThread();
testThread.start();//开启线程
//主线程听音乐
for (int i = 0; i < 100; i++) {
System.out.println("我在听音乐"+i);
}
}
}
实现Runnable接口创建多线程
//实现Runnable接口
public class TestThread implements Runnable{
//TestThread线程跑步
@Override
public void run() {
for (int i = 0; i < 100; i++) {
System.out.println("我跑了"+i+"米");
}
}
public static void main(String[] args) {
TestThread testThread = new TestThread();
new Thread(testThread).start();//启动线程
//主线程听音乐
for (int i = 0; i < 100; i++) {
System.out.println("我在听音乐"+i);
}
}
}
实现Callable接口创建多线程
//实现Callable接口
public class TestThread implements Callable<Integer> {
//TestThread线程跑步
@Override
public Integer call() {
int i;
for (i = 0; i < 100; i++) {
System.out.println("我跑了"+i+"米");
}
return i;
}
public static void main(String[] args) {
FutureTask<Integer> futureTask = new FutureTask<Integer>(new TestThread());
new Thread(futureTask).start();//启动线程
//接收线程运算后的结果
try{
Integer sum = futureTask.get();
} catch (InterruptedException e) {
e.printStackTrace();
} catch (ExecutionException e) {
e.printStackTrace();
}
//主线程听音乐
for (int i = 0; i < 100; i++) {
System.out.println("我在听音乐"+i);
}
}
}
线程池实现多线程
//线程池实现
public class TestThread implements Runnable {
//TestThread线程跑步
@Override
public void run() {
int i;
for (i = 0; i < 100; i++) {
System.out.println("我跑了"+i+"米");
}
}
public static void main(String[] args) {
//创建线程池
ExecutorService executorService = Executors.newFixedThreadPool(10);
TestThread testThread = new TestThread();
//为线程池分配任务
executorService.submit(testThread);
//关闭线程池
executorService.shutdown();
//主线程听音乐
for (int i = 0; i < 100; i++) {
System.out.println("我在听音乐"+i);
}
}
}
总结(优劣对比)
- 通过代码可以看出,第一种方法是最简洁方便的,直接就可以start,不需要任何转换
- 但是第一种有一个很不好的地方就是继承了Thread类后由于java的单继承机制,就不可以继承其他的类了,而如果实现的是接口,就可以实现多个接口,使开发更灵活。
- 第三种方法有两个优点:有返回值、可以抛出异常
实际开发中可能有更复杂的代码实现,需要继承其他的类,所以平时更推荐通过实现接口来实现多线程,也就是通过第二或第三种方式来实现,这样能保持代码灵活和解耦。
而选择第二还是第三种方式,则要根据run()方法是不是需要返回值或者捕获异常来决定,如果不需要,可以选择用第二种方式实现,代码更简洁。