Java中创建线程的三种方式
Java中创建线程的三种方式
1.继承Thread类创建线程
2.实现Runnable接口创建线程
3.使用Callable和Future创建线程
1.Thread创建线程
public class Match1 { public static void main(String[] args) { Runner liuxiang = new Runner(); liuxiang.setName("刘翔"); Runner zhangsan = new Runner(); //线程命名 zhangsan.setName("张三"); liuxiang.start(); zhangsan.start(); } } class Runner extends Thread{ @Override public void run() { Integer speed = new Random().nextInt(100); for (int i = 1; i <= 100; i++) { try { Thread.sleep(1000); } catch (InterruptedException e) { e.printStackTrace(); } System.out.println(this.getName()+"跑了"+i*speed+"米"); } } }
结果:

2.实现Runnable接口
public class Match2 { public static void main(String[] args) { Runner2 liuxiang = new Runner2(); // Thread thread1 = new Thread(liuxiang,"刘翔"); Thread thread1 = new Thread(liuxiang); thread1.setName("刘翔"); //后台继承Thread直接用不同,需要创建Thread对象来实现 Thread thread2 = new Thread(new Runner2(),"张三"); thread1.start(); thread2.start(); } } class Runner2 implements Runnable { @Override public void run() { Integer speed = new Random().nextInt(100); for (int i = 1; i <= 100; i++) { try { Thread.sleep(1000); } catch (InterruptedException e) { e.printStackTrace(); } //Thread.currentThread()用于获取当前线程 //在Runnable中无法使用this获取当前线程 System.out.println(Thread.currentThread().getName()+"跑了"+i*speed+"米"); } } }
结果:

3.利用线程池
public class Match3 { public static void main(String[] args) throws ExecutionException, InterruptedException { //创建线程池。线程池中有3个线程,可以执行3个线程,多余的线程会等待。 ExecutorService executorService = Executors.newFixedThreadPool(3); Runner3 liuxiang = new Runner3(); liuxiang.setName("刘翔"); Runner3 zhangsan = new Runner3(); zhangsan.setName("张三"); Runner3 lisi = new Runner3(); lisi.setName("李四"); Runner3 wangwu = new Runner3(); wangwu.setName("王五"); //Future用于接收线程内部call方法的返回值 Future<Integer> result1 = executorService.submit(liuxiang); Future<Integer> result2 = executorService.submit(zhangsan); Future<Integer> result3 = executorService.submit(lisi); try { Thread.sleep(5000); } catch (InterruptedException e) { e.printStackTrace(); } executorService.shutdown();//关闭线程池释放资源 System.out.println("刘翔跑了"+result1.get()+"米"); System.out.println("张三跑了"+result2.get()+"米"); System.out.println("李四跑了"+result3.get()+"米"); } } class Runner3 implements Callable<Integer> { private String name; public void setName(String name){ this.name = name; } //实现Callable接口的call方法允许有返回值和抛出异常 @Override public Integer call() throws Exception { Integer speed = new Random().nextInt(100); Integer distance = 0; for (int i = 1; i <= 100; i++) { try { Thread.sleep(10); } catch (InterruptedException e) { e.printStackTrace(); } distance = speed * i; System.out.println(this.name+"跑了"+distance+"米("+speed+"米/秒)"); } return distance; } }
结果:

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

作者:blanset
出处:https://www.cnblogs.com/blanset/
本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。

浙公网安备 33010602011771号