创建线程的几种方式

java多线程

Posted by zhenghao on 2019-04-15

创建线程的几种方式

继承Thread

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
public class Thread1 {
public static void main(String args[]){
Runner xiaoMing=new Runner();
xiaoMing.setName("小明");
Runner xiaoHong=new Runner();
xiaoHong.setName("小红");
xiaoHong.start();
xiaoMing.start();
}

}
class Runner extends Thread{
@Override
public void run() {
Integer speed=new Random().nextInt(100);
for(int i=0;i<100;i++){
System.out.println(this.getName()+"已经前进"+speed*i);
}

}
}

实现Runnable接口

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
public class thread2 {
public static void main(String args[]){
Thread xiaoMing=new Thread(new Runner2());
Thread xiaoHong=new Thread(new Runner2());
xiaoMing.setName("小明");
xiaoHong.setName("小红");
xiaoHong.start();
xiaoMing.start();
}
}
class Runner2 implements Runnable{
@Override
public void run() {
Integer speed=new Random().nextInt(100);
for(int i=0;i<100;i++){
System.out.println(Thread.currentThread().getName()+"前进"+speed*i);
}

}
}

使用Callable和Future创建线程

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
public class thread3 {
public static void main(String args[]) throws ExecutionException, InterruptedException {
ExecutorService executorService= Executors.newFixedThreadPool(2);
Runner3 xiaoMing=new Runner3();
xiaoMing.setName("小明");
Runner3 xiaoHing=new Runner3();
xiaoHing.setName("小红");

Future<Integer> result1=executorService.submit(xiaoMing);
Future<Integer> result2=executorService.submit(xiaoHing);
try {
Thread.sleep(5000);//休眠等待所有线程执行完成
}catch (Exception e){

}
executorService.shutdown();
System.out.println("小明"+result2.get());
System.out.println("小红"+result1.get());
}

}
class Runner3 implements Callable<Integer>{
private String name;
public void setName(String name){
this.name=name;
}
@Override
public Integer call() throws Exception {
Integer speed=new Random().nextInt(100);
Integer distince=0;
for(int i=1;i<=100;i++){
Thread.sleep(10);
distince=speed*i;
System.out.println(name+"前进"+speed*i);
}
return distince;
}
}

创建线程的三种方式的对比

继承Thread 实现Runnable接口 利用线程池
有点 变成简单执行效率高 面向接口编程执行效率高 容器管理线程允许返回异常
缺点 单继承无法对线程有效控制 无法对线程有效控制没有返回值 执行率相对低,编程麻烦
使用场景 不推荐 简单的多线程程序 企业级应用推荐